Chuyển đổi số tháng thành hàm tên tháng trong SQL


210

Tôi có nhiều tháng được lưu trữ trong SQL Server là 1,2,3,4, ... 12. Tôi muốn hiển thị chúng dưới dạng tháng 1, tháng 2, v.v. Có chức năng nào trong SQL Server như MonthName (1) = tháng 1 không? Tôi đang cố gắng tránh một tuyên bố CASE, nếu có thể.

Câu trả lời:


158

Một chút hack nhưng nên hoạt động:

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

2
Tại sao '-1'? Điều đó có cần thiết không vì các tháng trong SQL Server được bù bởi một?
Hassan Gulzar

2
@ DoomerDGR8 thực ra là vì ngày được sử dụng để gieo hàm dữ liệu bắt đầu từ 1. nếu chúng ta cần tên dữ liệu của tháng 1, chúng ta sẽ thêm 1 tháng vào 2008-01-01, sẽ cung cấp cho chúng ta 2008 / 02-01, tức là Tháng 2. vì vậy chúng tôi trừ đi 1 để tính đến điều này và chúng tôi lại nhận được tháng một.
DForck42

Để giải quyết vấn đề trừ 1 khỏi datetime của bạn, hãy sử dụng datetime vào tháng 12 thay vì tháng 1. Ví dụ: CHỌN DATENAME (tháng, DATEADD (tháng, @mydate, CAST ('1978-12-01' AS datetime)))
Steve Matthews

3
Đây là một thông tin tốt, nhưng không thực sự trả lời câu hỏi làm thế nào để chuyển đổi số tháng thành tên tháng (Thay vì trả lời làm thế nào để có được tên tháng từ một ngày). Bạn đã cho rằng anh ta có giá trị thời gian chứ không chỉ là số tháng; để làm việc này, giờ bạn cần 'phát minh' giá trị ngày / giờ. Hãy nghĩ rằng giải pháp từ leoinfo có liên quan hơn một chút
schizoid04

277

Tôi nghĩ rằng đây là cách tốt nhất để có được tên tháng khi bạn có số tháng

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

Hoặc là

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

24
để dễ đọc, tôi thực sự sẽ viết nó như thế này: Chọn DateName (tháng, DateAdd (tháng, @MonthNumber - 1, '1900-01-01'))
Valentino Vranken

10
một giải pháp thay thế khả thi Chọn DateName (tháng, DateAdd (tháng, @MonthNumber, -1))
Asif

4
Thật hoàn hảo. Đây nên là câu trả lời.
gotqn

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

3
Nó nhận được tên tháng theo ngày chứ không phải số tháng, như SO yêu cầu.
Imad

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

9
Tôi thích cách suy nghĩ thay thế rất trái lĩnh vực này! Thức ăn cho suy nghĩ
Michael Coleues

2
Và nó mang tính quyết định! Có thể được sử dụng như cột tính toán quá, cảm ơn!
IINA Soetomo

1
thật tuyệt ... tôi đã tìm kiếm một số mã đơn giản để có được nhiều tháng từ jan đến [#] và điều này đã làm việc rất tốt. để hiển thị vài tháng, chỉ cần thay đổi thành một cái gì đó như thế này >> SUBSTRING ('JAN FEB MAR APR MAY JUN AUG SEP OCT NOV DEC', 0, (@intMonth * 4))
Pablo

2
Tôi chắc chắn sẽ không nghĩ đây là "cách đúng đắn", nhưng đó là một cách thú vị có thể được sử dụng để giải quyết các vấn đề khác.
Paul

31

Sử dụng cách tốt nhất

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

21

Nó rất đơn giản.

select DATENAME(month, getdate())

sản lượng: tháng 1


4
Điều này chỉ hoạt động nếu bạn có một giá trị ngày đầy đủ, không phải là số nguyên tháng.
gunr2171

2
Đây không phải là một câu trả lời cho câu hỏi. Anh ta đang hỏi làm thế nào để thực hiện một chức năng như MonthName (1).
đặc biệt

8

Bạn có thể sử dụng CONVERTchức năng sẵn có

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

Điều này sẽ hiển thị 3 ký tự đầu tiên của tháng (JAN, FEB, v.v.)


7

ngoài bản gốc

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

bạn có thể làm được việc này

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

bằng cách này bạn có được tên cho tất cả các hàng trong một bảng. trong đó [cột_name] biểu thị một cột số nguyên chứa giá trị số từ 1 đến 12

2 đại diện cho bất kỳ số nguyên nào, bằng chuỗi liên hệ i đã tạo một ngày mà tôi có thể trích xuất tháng. '/ 1/2011' có thể là bất kỳ ngày nào

nếu bạn muốn làm điều này với biến

DECLARE @integer int;

SET @integer = 6;

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

7

Các công việc sau đây cho tôi:

CAST(GETDATE() AS CHAR(3))

6

Sử dụng câu lệnh này để chuyển đổi giá trị số Tháng thành tên Tháng.

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

Trừ khi tôi nhầm, đây không phải là số nguyên, như OP đã hỏi.
ảnh hưởng

5

Ở một số địa phương như tiếng Do Thái, có những tháng nhuận phụ thuộc vào năm vì vậy để tránh sai sót ở những địa phương đó, bạn có thể xem xét giải pháp sau:

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

1
Có một chức năng để chuyển đổi một ngày thành một ngày của người Do Thái trong SQL không? Không phải tôi biết ...
Hila DG

Chức năng chuyển đổi sang ngày của người Do Thái: blog.microsoft.co.il/gerireshef/2011/03/29/ Khăn
AJ AJ

5

Chắc chắn điều này sẽ làm việc

select datename(M,GETDATE())

5

Bắt đầu với SQL Server 2012, bạn có thể sử dụng FORMATDATEFROMPARTS để giải quyết vấn đề này. (Nếu bạn muốn tên tháng từ các nền văn hóa khác, hãy thay đổi en-US:)

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

Nếu bạn muốn một tháng ba chữ cái:

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

Nếu bạn thực sự muốn, bạn có thể tạo một chức năng cho việc này:

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

Đây là những gì tôi đang tìm kiếm. Cảm ơn bạn cho giải pháp.
Abdullah Al Mamun

Nó có thể không phải là hiệu quả nhất, nhưng nó có thể dễ đọc nhất.
Paul

1
Nó thậm chí còn hỗ trợ nội địa hóa! .. ngọt ngào!
Rosdi Kasim

4

Bạn có thể sử dụng chuyển đổi funcin như dưới đây

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

4

Chỉ cần trừ tháng hiện tại kể từ ngày hôm nay, sau đó thêm lại số tháng của bạn. Sau đó sử dụng hàm datename để cung cấp tên đầy đủ trong 1 dòng.

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

3

Tôi nghĩ rằng điều này là đủ để có được tên tháng khi bạn có ngày.

SELECT DATENAME(month ,GETDATE())


3

Để chuyển đổi số tháng thành tên tháng, hãy thử dưới đây

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

3
SELECT DATENAME(MONTH,dateadd(month, -3,getdate()))

1

Cái này làm việc cho tôi:

@MetricMonthNumber (some number)

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

Từ một bài đăng ở trên từ @leoinfo và @Valentino Vranken. Chỉ cần chọn nhanh và nó hoạt động.


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

Giải thích:

  1. Biến Decalre đầu tiên MonthNumber
  2. Nhận tháng hiện tại DatePartmà số tháng trở lại
  3. Tên tháng truy vấn thứ ba

1
select monthname(curdate());

HOẶC LÀ

select monthname('2013-12-12');

1

Làm việc cho tôi

SELECT MONTHNAME(<fieldname>) AS "Month Name" FROM <tablename> WHERE <condition>

1

bạn có thể có được ngày như thế này. ví dụ: - Bảng người dùng

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

bạn có thể lấy tên tháng như thế này

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

đầu ra

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

Bạn có thể tìm tài liệu ở đây. w3resource.com/mysql/date-and-time-fifts/ từ
Janaka Pushpakumara

OP yêu cầu máy chủ sql không phải mysql.
tavalendo

0

Sử dụng tuyên bố này để nhận tên tháng:

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

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

Điều này sẽ cung cấp cho bạn tên tháng ngắn. Như thế này: tháng một, tháng hai, tháng ba, vv


0

Đây là giải pháp của tôi sử dụng một số thông tin từ những người khác để giải quyết vấn đề.

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

0

Không có chức năng xác định hệ thống trong máy chủ SQL. Nhưng bạn có thể tạo hàm do người dùng xác định - hàm vô hướng. Bạn sẽ tìm thấy các hàm vô hướng trong Object Explorer cho cơ sở dữ liệu của mình: Khả năng lập trình-> Hàm-> Hàm có giá trị vô hướng. Dưới đây, tôi sử dụng một biến bảng để kết hợp tất cả lại với nhau.

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

Bạn có thể tạo một hàm như thế này để tạo Tháng và thực hiện CHỌN dbo.fn_GetMonthFromDate (date_column) dưới dạng Tháng TỪ tên_bảng


/****** 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

Cách dễ nhất là bằng cách gọi hàm MONTHNAME(your_date). your_date có thể là một giá trị tĩnh hoặc giá trị từ một trong các trường bảng của bạn.


0

CHỌN MONTHNAME (concat ('1970 -', [Tháng int val], '- 01'))

ví dụ- CHỌN MONTHNAME (concat ('1970 -', 4, '- 01'))

trả lời- tháng 4

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.