Lấy tháng và năm từ ngày giờ trong SQL Server 2005


87

Tôi cần tháng + năm kể từ ngày giờ trong SQL Server như 'Jan 2008'. Tôi đang nhóm truy vấn theo tháng, năm. Tôi đã tìm kiếm và tìm thấy các hàm như datepart, convert, v.v., nhưng không có hàm nào trong số chúng có vẻ hữu ích cho việc này. Am i thiếu cái gì ở đây? Có một chức năng cho điều này?


@Evan Carroll - điều này có cấu thành câu hỏi chiếm quyền điều khiển không? Nếu bạn có một câu trả lời cao cấp cho câu hỏi, bạn không nên cung cấp câu trả lời đó như một câu trả lời cho câu hỏi thay vì hướng mọi người đến một câu hỏi khác?
STLDev

@STLDeveloper làm cách nào để chiếm quyền điều khiển. Câu hỏi kêu gọi năm 2005? Tôi không đặt nó ở đó. Tôi không tìm kiếm 2005 .. Thật không may, câu trả lời tốt nhất ở đây không hoạt động trên 2005, nó là 2012 rõ ràng. Tôi có nên từ chối các câu trả lời năm 2005 vì đã cổ xưa không?
Evan Carroll

@STLDeveloper thực sự, tôi không quan tâm ở đây. =) Lập trường chính thức của tôi là luôn khuyên mọi người sử dụng PostgreSQL, không rõ tại sao tôi lại cố gắng giúp đỡ.
Evan Carroll

Tôi thấy hơi kỳ lạ khi bạn quay lại để tạo một phiên bản câu hỏi mới cho một phiên bản khác của sản phẩm và sau đó trả lời câu hỏi đó, tôi đoán là ổn.
STLDev

Câu trả lời:


74

Nếu bạn có nghĩa là bạn muốn chúng trở lại dưới dạng một chuỗi, ở định dạng đó;

SELECT 
  CONVERT(CHAR(4), date_of_birth, 100) + CONVERT(CHAR(4), date_of_birth, 120) 
FROM customers

Đây là các tùy chọn định dạng khác


Tôi đã thử sử dụng CONVERT (CHAR (4), GetDate (), 100) trên SQL Server của mình và thay vào đó tôi nhận được "09 1". Tôi nhận được không gian và một "1" cho 17. sử dụng "chọn CONVERT (varchar, getdate (), 100)" năng suất "09 17 2009 16:59"
Nap

1
Điều đó thật kỳ lạ - từ các tài liệu mà tôi đã liên kết, 100 sẽ trả về một chữ viết tắt của tháng gồm ba chữ cái và một dấu cách, nếu được ghép vào một CHAR (4). Nhưng sau đó, kết quả bạn đã đăng cho CONVERT (varchar, getdate (), 100) trông khác với những gì tôi mong đợi. Bạn đang sử dụng phiên bản SQLServer nào? Bạn đang sử dụng cài đặt bản địa hóa / quốc tế hóa nào (điều này không quan trọng với định dạng 100).
robsoft 17/09/09

171
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)

Vì vậy, tôi nghĩ đây là những gì tôi muốn, nhưng tôi không thấy TSQL sẽ hiểu sự khác biệt giữa datepart(month,getdate())datepart(year,getdate()). Là gì thángnăm ?
jp2code

4
@ jp2code thángnăm về cơ bản là các hằng số được định nghĩa ở đây: msdn.microsoft.com/en-us/library/ms174420.aspx . TSQL hiểu họ giống như cách bạn làm, bằng cách đọc chúng :)
Zachary Yates

1
LOL - Cảm ơn Zach. Tôi đã theo dõi điều đó một thời gian dài trước khi tìm ra nó trên một trang web khác.
jp2code

Gọn gàng hơn nhiều so với chức năng chuyển đổi. #cleanCode
RBT

51

Bắt đầu với SQL Server 2012, bạn có thể sử dụng:

SELECT FORMAT(@date, 'yyyyMM')

1
Thưa ông cũng chơi ... Đây đã trả lời câu hỏi của tôi trong năm 2012
Squ1rr3lz

Tôi rất vui vì tôi đã cuộn đến đây, điều này rất gọn gàng và đơn giản. Cảm ơn!
Niklas

Đây là một đóng góp có giá trị nhưng nó cần phải có được trả lời ở nơi khác, stackoverflow.com/a/43196370/124486
Evan Carroll

12

Sử dụng:

select datepart(mm,getdate())  --to get month value
select datename(mm,getdate())  --to get name of month

11

Thật buồn cười, tôi chỉ đang chơi xung quanh việc viết cùng một truy vấn này trong SQL Server và sau đó là LINQ.

SELECT 
    DATENAME(mm, article.Created) AS Month, 
    DATENAME(yyyy, article.Created) AS Year, 
    COUNT(*) AS Total 
FROM Articles AS article 
GROUP BY 
    DATENAME(mm, article.Created), 
    DATENAME(yyyy, article.Created) 
ORDER BY Month, Year DESC

Nó tạo ra thông báo sau (ví dụ).

Month | Year | Total

January | 2009 | 2

9

Trong SQL server 2012, có thể sử dụng bên dưới

chọn ĐỊNH DẠNG (getdate (), 'MMM yyyy')

Điều này cho biết chính xác "Tháng 6 năm 2016"


6

Còn cái này thì sao?

Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )


5

Định dạng đó không tồn tại. Bạn cần thực hiện kết hợp hai điều,

select convert(varchar(4),getdate(),100)  + convert(varchar(4),year(getdate()))

4

cách tốt nhất để làm điều đó là với:

dateadd(month,datediff(month,0,*your_date*),0)

nó sẽ giữ kiểu ngày giờ của bạn


1
Cho đến nay, đây là câu trả lời tốt nhất cho việc buộc bất kỳ ngày nào chỉ là tháng và năm, bỏ qua các thành phần ngày và giờ. Tốt hơn nhiều so với câu trả lời được chấp nhận vì thông tin có thể được sắp xếp chính xác và hoạt động chính xác như một ngày trong các công cụ báo cáo hạ nguồn.
Jamie Thomas

Tôi hoàn toàn đồng ý rằng đây là cách tốt nhất để có được đầu tháng. Nó giữ kiểu dữ liệu datetime và để kết xuất cho đến giao diện người dùng, nơi cần có. Đây là cách chính xác để thực hiện những việc như nhóm các hàng theo tháng của trường.
Jeff Breadner

2

trả về tên tháng đầy đủ, -, năm đầy đủ, ví dụ: March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))

2
Đã có 18 câu trả lời khác cho câu hỏi này. Câu trả lời của bạn thêm thông tin mới nào?
stannius

1

Tôi đã gặp vấn đề tương tự và sau khi xem xét xung quanh, tôi thấy điều này:

SELECT DATENAME(yyyy, date) AS year
FROM Income
GROUP BY DATENAME(yyyy, date)

Nó hoạt động tuyệt vời!


1

Việc chuyển đổi ngày thành ngày đầu tiên của tháng cho phép bạn Nhóm Theo và Đặt hàng Theo một thuộc tính và theo kinh nghiệm của tôi thì nhanh hơn.

declare @mytable table(mydate datetime)
declare @date datetime
set @date = '19000101'
while @date < getdate() begin
    insert into @mytable values(@date)
    set @date = dateadd(day,1,@date)
end

select count(*) total_records from @mytable

select dateadd(month,datediff(month,0,mydate),0) first_of_the_month, count(*) cnt
from @mytable
group by dateadd(month,datediff(month,0,mydate),0)

1
---Lalmuni Demos---
create table Users
(
userid int,date_of_birth date
)
---insert values---
insert into Users values(4,'9/10/1991')

select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years, 
MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months, 
DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days,
from users

1
cast(cast(sq.QuotaDate as date) as varchar(7))

cung cấp định dạng "2006-04"



0

Có, bạn có thể sử dụng datename(month,intime)để lấy tháng trong văn bản.


0
  ,datename(month,(od.SHIP_DATE)) as MONTH_

Trả lời: MONTH_ Tháng 1 Tháng 1 Tháng 9 Tháng 10 Tháng 12 Tháng 10 Tháng 9


0

Nó hoạt động tốt.

DECLARE @pYear VARCHAR(4)

DECLARE @pMonth VARCHAR(2)

DECLARE @pDay VARCHAR(2)

SET @pYear  = RIGHT(CONVERT(CHAR(10), GETDATE(), 101), 4)

SET @pMonth = LEFT(CONVERT(CHAR(10), GETDATE(), 101), 2)

SET @pDay   = SUBSTRING(CONVERT(CHAR(10), GETDATE(), 101), 4,2)

SELECT @pYear,@pMonth,@pDay

-3

Sau đây hoạt động hoàn hảo! Mình mới sử dụng, hãy dùng thử.

date_format(date,'%Y-%c')

2
đây không phải là một giá trị chức năng SQL Server hoặc tuyên bố
franko_camron
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.