SQLで月数を月名関数に変換する


210

SQL Serverに1、2、3、4、... 12として保存されている月があります。1月、2月などと表示したいのですが、MonthName(1)= JanuaryのようなSQL Serverの関数はありますか?可能であれば、CASEステートメントを回避しようとしています。

回答:


158

少しハッキーですが、うまくいくはずです:

SELECT DATENAME(month, DATEADD(month, @mydate-1, CAST('2008-01-01' AS datetime)))

2
なぜ「-1」なのですか?SQL Serverの月が1でオフセットされるため、それは必要ですか?
Hassan Gulzar 2016年

2
@ DoomerDGR8これは、dateadd関数のシードに使用される日付が1から始まるためです。1月の日付名が必要な場合、2008-01-01に1か月を追加すると、2008-02-01になります。 2月。これを考慮して1を減算すると、1月が再び得られます。
DForck42

日時から1を引く問題を回避するには、1月ではなく12月の日時を使用します。たとえば、SELECT DATENAME(month、DATEADD(month、@mydate、CAST( '1978-12-01' AS datetime)))
Steve Matthews

3
これは良い情報ですが、実際に月番号を月名に変換する方法の質問には答えません(日付から月名を取得する方法に答えます)。あなたは彼が単に月番号ではなく日時値を持っていると仮定しました。これを機能させるには、日付/時刻値を「発明」する必要があります。leoinfoからソリューションは、もう少し関連だったと思う
schizoid04

277

これは、月番号があるときに月の名前を取得する最良の方法だと思います

Select DateName( month , DateAdd( month , @MonthNumber , 0 ) - 1 )

または

Select DateName( month , DateAdd( month , @MonthNumber , -1 ) )

24
読みやすさのために、実際には次のように記述します。SelectDateName(month、DateAdd(month、@MonthNumber-1、 '1900-01-01'))
Valentino Vranken

10
1つの可能な代替ソリューションSelect DateName(month、DateAdd(month、@MonthNumber、-1))
Asif

4
それは最高です。これが答えです。
gotqn 2013年


72
SUBSTRING('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ', (@intMonth * 4) - 3, 3)

9
私はこの非常に左のフィールドの代替の考え方が好きです!思考の糧
マイケルロドリゲス

2
そしてそれは決定論的です!計算列としても使用できます。ありがとうございます。
Irawanソウトモ

1
いい... janから[#]に数か月かかる単純なコードを探していたところ、これはうまく機能した。数ヶ月、このようなものにだけ変更を表示する>> SUBSTRING(「1月2月3月4月MAY 6月7月8月9月10月11月12月」(@intMonth * 4)、0、)
パブロ・コントレラス

2
これは「正しい方法」だとは思いませんが、他の問題を解決するのに使用できる楽しい方法です。
ポール


21

とても簡単です。

select DATENAME(month, getdate())

出力:1月


4
これは、月の整数ではなく完全な日付値がある場合にのみ機能します。
gunr2171

2
これは質問に対する答えではありません。彼はMonthName(1)のような関数を実装する方法を尋ねています。
2018年

8

組み込みCONVERT関数を使用できます

select CONVERT(varchar(3), Date, 100)  as Month from MyTable.

これにより、月の最初の3文字が表示されます(JAN、FEBなど)。


7

オリジナルに加えて

SELECT DATENAME(m, str(2) + '/1/2011')

あなたはこれを行うことができます

SELECT DATENAME(m, str([column_name]) + '/1/2011')

このようにして、テーブルのすべての行の名前を取得します。ここで、[column_name]は、1〜12の数値を含む整数列を表します

2は任意の整数を表し、連絡先文字列によって、月を抽出できる日付を作成しました。'/ 1/2011'は任意の日付にすることができます

これを変数で実行したい場合

DECLARE @integer int;

SET @integer = 6;

SELECT DATENAME(m, str(@integer) + '/1/2011')


6

このステートメントを使用して、月の数値を月の名前に変換します。

SELECT CONVERT(CHAR(3), DATENAME(MONTH, GETDATE()))

OPが尋ねたように、私が間違っていない限り、これは整数を使用していません。
流入

5

ヘブライ語などの一部のロケールでは、年によってうるう月が存在するため、そのようなロケールでのエラーを回避するには、次の解決策を検討します。

SELECT DATENAME(month, STR(YEAR(GETDATE()), 4) + REPLACE(STR(@month, 2), ' ', '0') + '01')     

1
SQLで日付をユダヤ人の日付に変換する関数はありますか?私が知っていることではありません...
Hila DG

ユダヤ人の日付に変換する機能:blogs.microsoft.co.il/gerireshef/2011/03/29/...
AJ AJ


5

SQL Server 2012以降、FORMATおよびDATEFROMPARTSを使用してこの問題を解決できます。(あなたが他の文化から月の名前をしたい場合は、変更:en-US

select FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMMM', 'en-US')

3文字の月が必要な場合:

select FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMM', 'en-US')

本当にしたい場合は、これのための関数を作成できます。

CREATE FUNCTION fn_month_num_to_name
(
    @month_num tinyint
)
RETURNS varchar(20)
AS
BEGIN
    RETURN FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMMM', 'en-US')
END

これは私が探しているものです。解決していただきありがとうございます。
Abdullah Al Mamun

それはおそらく最も効率的ではありませんが、おそらく最も読みやすいでしょう。
ポール・

1
ローカリゼーションもサポートしています。
Rosdi Kasim

4

以下のように変換関数を使用できます

CONVERT(VARCHAR(3), DATENAME(MM, GETDATE()), 100)

4

今日の日付から現在の月を引いて、月数を追加します。次に、datename関数を使用して、フルネームをすべて1行で入力します。

print datename(month,dateadd(month,-month(getdate()) + 9,getdate()))

3

私はあなたが日付を持っているときに月の名前を取得するにはこれで十分だと思います。

SELECT DATENAME(month ,GETDATE())


3

月番号を月名に変換するには、以下を試してください

declare @month smallint = 1
select DateName(mm,DATEADD(mm,@month - 1,0))


1

これは私のために働きました:

@MetricMonthNumber (some number)

SELECT 
(DateName( month , DateAdd( month , @MetricMonthNumber - 1 , '1900-01-01' ) )) AS MetricMonthName
FROM TableName

上記の@leoinfoと@Valentino Vrankenの投稿から。クイック選択を行っただけで機能します。


1
Declare @MonthNumber int
SET @MonthNumber=DatePart(Month,GETDATE())
Select DateName( month , DateAdd( month , @MonthNumber , 0 ) - 1 )

説明:

  1. 最初のデカール変数 MonthNumber
  2. DatePart返却月番号の現在の月を取得します
  3. 3番目のクエリが月の名前を返す



1

このような日付を取得できます。例:- ユーザーテーブル

id name created_at
1  abc  2017-09-16
2  xyz  2017-06-10

このような月名を取得できます

select year(created_at), monthname(created_at) from users;

出力

+-----------+-------------------------------+
| year(created_at) | monthname(created_at)  |
+-----------+-------------------------------+
|      2017        | september              |
|      2017        | june                   |

ドキュメントはここにあります。w3resource.com/mysql/date-and-time-functions/...
ジャナカPushpakumara

OPはmysqlではなくsql-serverを要求しました。
tavalendo 2018年

0

月名を取得するには、次のステートメントを使用します。

DECLARE @date datetime
SET @date='2015/1/4 00:00:00'

SELECT CAST(DATENAME(month,@date )  AS CHAR(3))AS 'Month Name'

これにより、短い月の名前が表示されます。このように:1月、2月、3月など


0

問題を解決するために他の人からの情報を使用する私の解決策は次のとおりです。

datename(month,dateadd(month,datepart(month,Help_HelpMain.Ticket_Closed_Date),-1)) as monthname

0

SQLサーバーにはシステム定義関数はありません。ただし、独自のユーザー定義関数(スカラー関数)を作成できます。データベースのオブジェクトエクスプローラーでスカラー関数を見つけます:プログラマビリティ->関数->スカラー値関数。以下では、テーブル変数を使用してすべてをまとめています。

--Create the user-defined function
CREATE FUNCTION getmonth (@num int)
RETURNS varchar(9) --since 'September' is the longest string, length 9
AS
BEGIN

DECLARE @intMonth Table (num int PRIMARY KEY IDENTITY(1,1), month varchar(9))

INSERT INTO @intMonth VALUES ('January'), ('February'), ('March'), ('April'), ('May')
                           , ('June'), ('July'), ('August') ,('September'), ('October')
                           , ('November'), ('December')

RETURN (SELECT I.month
        FROM @intMonth I
        WHERE I.num = @num)
END
GO

--Use the function for various months
SELECT dbo.getmonth(4) AS [Month]
SELECT dbo.getmonth(5) AS [Month]
SELECT dbo.getmonth(6) AS [Month]

0

このような関数を作成して月を生成し、SELECT dbo.fn_GetMonthFromDate(date_column)をMonth FROM table_nameとして実行できます。


/****** Object:  UserDefinedFunction [dbo].[fn_GetMonthFromDate]    Script Date: 11/16/2018 10:26:33 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[fn_GetMonthFromDate] 
(@date datetime)
RETURNS varchar(50)
AS
BEGIN
    DECLARE @monthPart int

SET @monthPart = MONTH(@date) IF @monthPart = 1 BEGIN RETURN 'January' END ELSE IF @monthPart = 2 BEGIN RETURN 'February' END ELSE IF @monthPart = 3 BEGIN RETURN 'March' END ELSE IF @monthPart = 4 BEGIN RETURN 'April' END ELSE IF @monthPart = 5 BEGIN RETURN 'May' END ELSE IF @monthPart = 6 BEGIN RETURN 'June' END ELSE IF @monthPart = 7 BEGIN RETURN 'July' END ELSE IF @monthPart = 8 BEGIN RETURN 'August' END ELSE IF @monthPart = 9 BEGIN RETURN 'September' END ELSE IF @monthPart = 10 BEGIN RETURN 'October' END ELSE IF @monthPart = 11 BEGIN RETURN 'November' END ELSE IF @monthPart = 12 BEGIN RETURN 'December' END RETURN NULL END


0

SELECT MONTHNAME(concat( '1970-'、[Month int val]、 '-01'))

例-SELECT MONTHNAME(concat( '1970-'、4、 '-01'))

回答-4月

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.