2011-11-29 46 views
15

Trong T-SQL cách tốt nhất để chuyển đổi tên tháng thành một số là gì?Chuyển đổi tên tháng thành số tháng trong SQL Server

ví dụ:

'January' -> 1 
'February' -> 2 
'March' -> 3 

vv

Có bất kỳ được xây dựng trong các chức năng có thể làm được điều này?

+0

nó sẽ giúp chúng tôi nếu bạn mở rộng câu hỏi và yêu cầu một chút – Sandy

Trả lời

26

Làm thế nào về điều này?

select DATEPART(MM,'january 01 2011') -- returns 1 
select DATEPART(MM,'march 01 2011') -- returns 3 
select DATEPART(MM,'august 01 2011') -- returns 8 
2

Không có chức năng tích hợp cho chức năng này.

Bạn có thể sử dụng một lệnh CASE:

CASE WHEN MonthName= 'January' THEN 1 
    WHEN MonthName = 'February' THEN 2 
    ... 
    WHEN MonthName = 'December' TNEN 12 
END AS MonthNumber 

hoặc tạo một bảng tra cứu để tham gia chống lại

CREATE TABLE Months (
    MonthName VARCHAR(20), 
    MonthNumber INT 
); 

INSERT INTO Months 
    (MonthName, MonthNumber) 
    SELECT 'January', 1 
    UNION ALL 
    SELECT 'February', 2 
    UNION ALL 
    ... 
    SELECT 'December', 12; 

SELECT t.MonthName, m.MonthNumber 
    FROM YourTable t 
     INNER JOIN Months m 
      ON t.MonthName = m.MonthName; 
+0

@ MarkStorey-Smith của bạn: THÁNG Hàm nhận một kiểu ngày giờ hoặc kiểu ngày tháng, không phải là một chuỗi có tên tháng như OP đã chỉ ra trong câu hỏi của anh ta. –

-2
select Convert(datetime, '01 ' + Replace('OCT-12', '-', ' '),6) 
+3

Câu hỏi đã được trả lời chính xác với một số upvotes và trên hết, câu trả lời này là sai, kết quả của truy vấn này là '2012-10-01 00: 00: 00.000', không có gì liên quan đến câu hỏi – Yaroslav

0

Bạn có thể làm theo cách này, nếu bạn có ngày (ví dụ Đã gửiDate)

DATENAME(MONTH,DATEADD(MONTH, MONTH(SubmittedDate) - 1, 0)) AS ColumnDisplayMonth 

Hoặc bạn có thể làm tôi theo cách này, nếu bạn có tháng dưới dạng int

DATENAME(MONTH,DATEADD(MONTH, @monthInt - 1, 0)) AS ColumnDisplayMonth 
2

Bạn có thể tạo hàm và sau đó tham chiếu nó trong câu lệnh chọn. Chức năng có thể trông giống như sau:

if OBJECT_ID('fn_month_name_to_number', 'IF') is not null 
drop function fn_month_name_to_number 
go 
create function fn_month_name_to_number (@monthname varchar(25)) 
returns int as 
begin 
declare @monthno as int; 
select @monthno = 
case @monthname 
when 'January' then 1 
when 'February' then 2 
when 'March' then 3 
when 'April' then 4 
when 'May' then 5 
when 'June' then 6 
when 'July' then 7 
when 'August' then 8 
when 'September' then 9 
when 'October' then 10 
when 'November' then 11 
when 'December' then 12 
end 
return @monthno 
end 

Sau đó, bạn có thể truy vấn nó.

select fn_month_name_to_number ('February') as month_no 

Truy vấn này sẽ trả về 2 là số tháng. Bạn có thể chuyển giá trị từ một cột làm tham số cho hàm.

select fn_month_name_to_number (*columnname*) as month_no from *tablename* 

Chúc bạn một ngày tốt lành!

+1

Có nhiều con đường chúng ta có thể lấy từ nebraska đến alaska. Tôi chọn canada, bạn panama ... – Christian

0

Bạn có thể sử dụng mã dưới đây

DECLARE @T TABLE ([Month] VARCHAR(20)) 
INSERT INTO @T 
SELECT 'January' 
UNION 
SELECT 'February' 
UNION 
SELECT 'March'` 

SELECT MONTH('01-' + [Month] + '-2010') As MonthNumeric,[Month] FROM @T 
ORDER BY MonthNumeric 
11

Làm thế nào về điều này:

SELECT MONTH('March' + ' 1 2014') 

Would return 3.

+0

Không chắc chắn cái nào hoạt động tốt hơn – Faiz

+0

cho những người khác, lưu ý rằng '1 2004' chỉ là một ngày và năm giả và có thể là bất cứ điều gì, tốt nhất là một số ngày cũ. –

1

Gần đây tôi đã có trải nghiệm tương tự (máy chủ sql 2012). Tôi không có quyền kiểm soát đầu vào, tôi chỉ có một yêu cầu để báo cáo về nó. May mắn những ngày được nhập với lãnh đạo từ viết tắt alpha tháng 3 nhân vật, vì vậy đây đã làm cho nó đơn giản & nhanh:

TRY_CONVERT(DATETIME,REPLACE(obs.DateValueText,SUBSTRING(obs.DateValueText,1,3),CHARINDEX(SUBSTRING(obs.DateValueText,1,3),'...JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC')/4)) 

Nó làm việc cho 12 giờ:
Feb-14-2015 17:00:00 2015- 02-14 17: 00: 00.000
và 24 giờ:
Sep-27-2013 22:45 2013-09-27 22:45:00.000

(nhờ ryanyuyu)

+0

Định dạng SQL của bạn sẽ làm cho câu trả lời của bạn thực sự có thể đọc được. Tôi đề nghị định dạng nó trong một trình soạn thảo văn bản khác, sau đó dán mã được định dạng vào đây (và nhấp vào nút mã định dạng nếu cần). – ryanyuyu

+0

Giúp tôi vì 3 chữ viết tắt alpha tháng. Cảm ơn! – SQLHound

3
SELECT DATEPART(MM,'january '+'01 1900') 
SELECT MONTH('january ' + '01 1900') 
SELECT month(dateadd(month,DATEDIFF(month,0,'january 01 2015'),0)) 
1

Tôi nghĩ rằng bạn thậm chí có thể có một bảng riêng biệt như một monthdetails (Monthno int, monthnames char(15)) và bao gồm các giá trị:

1 January 
2 February 

.... và như vậy, và sau đó tham gia bảng này với bảng hiện có của bạn trong cột monthnames

SELECT t1.*,t2.Monthno from table1 
left outer join monthdetails t2 
on t1.monthname=t2.monthnames 
order by t2.Monthno 
0

Tôi biết điều này có thể là một chút quá muộn nhưng cách hiệu quả nhất để làm điều này thông qua một CTE như sau:

WITH Months AS 
    (
     SELECT 1 x 
     UNION all 
     SELECT x + 1 
     FROM Months 
     WHERE x < 12 

    ) 
    SELECT x AS MonthNumber, DateName(month , DateAdd(month , x , -1))   AS MonthName FROM Months 
0

Bạn có thể thử sth như thế này, nếu bạn có MONTH_NAME đó là chuỗi datetype.After chuyển đổi , bạn có thể tự do đặt hàng theo Tháng.

Ví dụ, bảng của bạn như thế này:

month 
Dec 
Jan 
Feb 
Nov 
Mar 
    . 
    . 
    . 

cú pháp của tôi là:

Month(cast(month+'1 2016' as datetime)) 
Các vấn đề liên quan