แปลงหมายเลขเดือนเป็นฟังก์ชันชื่อเดือนใน SQL


210

ฉันเก็บเดือนไว้ใน SQL Server เป็น 1,2,3,4, ... 12 ฉันต้องการแสดงเป็นมกราคมกุมภาพันธ์เป็นต้นมีฟังก์ชันใน SQL Server เช่น MonthName (1) = January หรือไม่ ฉันพยายามหลีกเลี่ยงคำสั่ง CASE ถ้าเป็นไปได้

คำตอบ:


158

แฮ็คเล็กน้อย แต่ควรทำงาน:

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

2
ทำไม '-1' นั่นเป็นสิ่งจำเป็นหรือไม่เพราะเดือนใน SQL Server นั้นถูกหักล้างด้วยหนึ่งเดือน
Hassan Gulzar

2
@ DoomerDGR8 เป็นจริงเพราะวันที่ที่ใช้ในการ seed ฟังก์ชั่น dateadd เริ่มต้นที่ 1 หากเราต้องการชื่อเดือนมกราคมเราจะเพิ่ม 1 เดือนถึง 2008-01-01 ซึ่งจะให้เรา 2008-02-01 ซึ่งเป็น กุมภาพันธ์. ดังนั้นเราจึงลบ 1 ถึงบัญชีสำหรับสิ่งนี้และเราจะได้มกราคมอีกครั้ง
DForck42

หากต้องการแก้ไขปัญหาการลบ 1 จากวันที่และเวลาของคุณให้ใช้วันที่และเวลาในเดือนธันวาคมตรงข้ามกับเดือนมกราคม ตัวอย่างเช่น SELECT DATENAME (เดือน, DATEADD (เดือน, @mydate, CAST ('1978-12-01' AS datetime)))
Steve Matthews

3
นี่เป็นข้อมูลที่ดี แต่ไม่สามารถตอบคำถามว่าจะแปลงหมายเลขเดือนเป็นชื่อเดือนได้อย่างไร (ตอบกลับวิธีรับชื่อเดือนจากวันที่) คุณคิดว่าเขามีค่าวันที่และเวลามากกว่าเพียงแค่จำนวนเดือน เพื่อให้มันทำงานคุณต้อง 'ประดิษฐ์' ค่าวันที่ / เวลา คิดว่าการแก้ปัญหาจาก leMp3 นั้นมีความเกี่ยวข้องมากกว่า
schizoid04

277

ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในการรับชื่อเดือนเมื่อคุณมีหมายเลขเดือน

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

หรือ

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

24
เพื่อจุดประสงค์ในการอ่านฉันจะเขียนแบบนี้จริง ๆ : เลือก DateName (เดือน, วันที่เพิ่ม (เดือน, @MonthNumber - 1, '1900-01-01'))
Valentino Vranken

10
โซลูชันทางเลือกหนึ่งที่เป็นไปได้เลือก DateName (เดือน, DateAdd (เดือน, @MonthNumber, -1))
Asif

4
มันสมบูรณ์แบบ นี่ควรเป็นคำตอบ
gotqn

94
SELECT DATENAME(month, GETDATE()) AS 'Month Name'

3
มันคือการรับชื่อเดือนตามวันที่ไม่ใช่หมายเลขเดือนตามที่ถามดังนั้น
Imad

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

9
ฉันชอบวิธีการคิดทางซ้ายนี้มาก ๆ ! อาหารสำหรับความคิด
Michael Rodrigues

2
และมันก็กำหนดขึ้น! สามารถใช้เป็นคอลัมน์ที่คำนวณได้เช่นกันขอบคุณ!
Irawan Soetomo

1
ดี ... ฉันกำลังมองหารหัสง่ายๆที่จะได้รับเดือนจากมกราคมถึง [#] และมันใช้งานได้ดี สำหรับการแสดงเป็นเวลาหลายเดือนเพียงเปลี่ยนเป็นแบบนี้ >> การสร้าง ('ม.ค. FEB มีนาคมเมษายนอาจมิถุนายนสิงหาคมสิงหาคมตุลาคมพฤศจิกายน', 0, (@intMonth * 4))
Pablo Contreras

2
ฉันไม่คิดว่านี่จะเป็น "วิธีที่ถูกต้อง" แต่มันเป็นวิธีที่สนุกที่สามารถใช้แก้ปัญหาอื่น ๆ ได้
พอล


21

มันง่ายมาก

select DATENAME(month, getdate())

เอาท์พุท: มกราคม


4
ใช้งานได้เฉพาะถ้าคุณมีค่าวันที่เต็มไม่ใช่จำนวนเต็มเดือน
gunr2171

2
นี่ไม่ใช่คำตอบสำหรับคำถาม เขากำลังถามวิธีการใช้ฟังก์ชั่นเช่น MonthName (1)
amuliar

8

คุณสามารถใช้CONVERTฟังก์ชั่นinbuilt

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')

ถ้าคุณต้องการเดือนสามตัวอักษร:

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

มันอาจจะไม่ได้มีประสิทธิภาพมากที่สุด แต่มันอาจจะอ่านง่ายที่สุด
Paul

1
มันรองรับการแปลภาษาท้องถิ่น .. หวาน!
Rosdi Kasim

4

คุณสามารถใช้ฟังก์ชันการแปลงได้ดังต่อไปนี้

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

4

เพียงแค่ลบเดือนปัจจุบันจากวันที่วันนี้จากนั้นเพิ่มหมายเลขเดือนของคุณกลับ จากนั้นใช้ฟังก์ชันชื่อไฟล์เพื่อให้ชื่อเต็มใน 1 บรรทัด

print datename(month,dateadd(month,-month(getdate()) + 9,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

จากโพสต์ด้านบนจาก @leMp3 และ @Valentino Vranken เพิ่งเลือกอย่างรวดเร็วและใช้งานได้


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

ชี้แจง:

  1. ตัวแปรแรกของ Decalre MonthNumber
  2. รับเดือนปัจจุบันDatePartที่ส่งคืนหมายเลขเดือน
  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/…
Janaka Pushpakumara

OP ขอ sql-server ไม่ใช่ mysql
tavalendo

0

ใช้คำสั่งนี้เพื่อรับชื่อเดือน:

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

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

ชื่อนี้จะให้ชื่อสั้น ๆ เช่นนี้: ม.ค. , ก.พ. , มี.ค. , ฯลฯ


0

นี่คือวิธีการแก้ปัญหาของฉันโดยใช้ข้อมูลบางอย่างจากคนอื่น ๆ เพื่อแก้ปัญหา

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

0

ไม่มีฟังก์ชั่นที่ระบบกำหนดในเซิร์ฟเวอร์ SQL แต่คุณสามารถสร้างฟังก์ชั่นที่ผู้ใช้กำหนดเองซึ่งเป็นฟังก์ชันสเกลาร์ คุณจะพบฟังก์ชั่นสเกลาร์ใน Object Explorer สำหรับฐานข้อมูลของคุณ: ความสามารถในการโปรแกรม -> ฟังก์ชั่น -> ฟังก์ชั่นที่คุ้มค่าสเกลาร์ ด้านล่างฉันใช้ตัวแปรตารางเพื่อรวมเข้าด้วยกัน

--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) เป็นเดือนจาก 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

MONTHNAME(your_date)วิธีที่ง่ายที่สุดคือการเรียกใช้ฟังก์ชัน your_dateสามารถเป็นค่าคงที่หรือค่าจากหนึ่งในเขตข้อมูลตารางของคุณ


0

เลือก MONTHNAME (concat ('1970 -', [Month int val], '- 01'))

ตัวอย่าง - เลือก MONTHNAME (concat ('1970 -', 4, '- 01'))

คำตอบ - เมษายน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.