Làm cách nào để có được một ngày ở định dạng YYYY-MM-DD từ trường thời gian TSQL?


259

Làm cách nào để truy xuất ngày từ SQL Server ở YYYY-MM-DDđịnh dạng? Tôi cần điều này để làm việc với SQL Server 2000 trở lên. Có một cách đơn giản để thực hiện việc này trong SQL Server hay việc chuyển đổi nó theo chương trình sẽ dễ dàng hơn sau khi tôi truy xuất tập kết quả?

Tôi đã đọc CAST và CHUYỂN ĐỔI trên Microsoft Technet, nhưng định dạng tôi muốn không được liệt kê và thay đổi định dạng ngày không phải là một tùy chọn.


Mô tả BOL cho 126 là một chút nhầm lẫn (không bao giờ tìm thấy lời giải thích cho "T").
nojetlag

Chữ "T" phân tách ngày với thời gian. Xem ISO 8601 trên Wikipedia
krubo

Câu trả lời:


428
SELECT CONVERT(char(10), GetDate(),126)

Giới hạn kích thước của các nhóm varchar của phần giờ mà bạn không muốn.


3
Không, nhưng một số khách hàng có vấn đề với độ dài cố định.
gbn

54
Bài đăng này xuất hiện trên Google để chuyển đổi sang YYYYMMDD - sao cho đó là: CONVERT (char (10), GetDate (), 112)
NealWalters

1
Điều này không làm việc cho tôi, đề xuất ở trên với mã 112 đã làm. Cảm ơn @NealWalters
AlexVPerl

4
Danh sách mã số nguyên cho các kiểu đầu ra: msdn.microsoft.com/en-us/l Library / ms187928.aspx
Ben Fransen

Mã 126 phù hợp với các ngày như ngày sinh ở định dạng YYYY-mm-dd: CONVERT (char (10), pat_dob, 126) là pat_dob
jjwdesign

118
SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM

SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy – 10/02/2008                  

SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           

SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy

SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy

SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy

SELECT convert(varchar, getdate(), 106) -- dd mon yyyy

SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy

SELECT convert(varchar, getdate(), 108) -- hh:mm:ss

SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)

SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy

SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd

SELECT convert(varchar, getdate(), 112) -- yyyymmdd

SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm

SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm

SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm

1
làm thế nào để có được 'm / d / yyyy' thay vì 'mm / dd / yyyy'
user_az

Đây là câu trả lời hữu ích nhất, cho đến nay.
Daniel

109

Bắt đầu với SQL Server 2012 (câu hỏi ban đầu là năm 2000):

SELECT FORMAT(GetDate(), 'yyyy-MM-dd')


Đây là cách linh hoạt để thực hiện ngày / giờ trong các phiên bản SQL gần đây bằng cách sử dụng các định dạng chuẩn Dotnet. Hãy nhớ viết hoa tháng MM để phân biệt với phút. Tất cả các định dạng thời gian ngày
jim birch

FORMAT chạy (thường) chậm hơn 43 lần so với CHUYỂN ĐỔI. Tôi thực sự khuyên bạn không bao giờ (và tôi không sử dụng từ đó thường xuyên) sử dụng FORMAT.
Jeff Moden

35

Các hình thức bạn sau khi được liệt kê trong các tài liệu trực tuyến sách.

http://msdn.microsoft.com/en-us/l Library / aa226054 (MySQL.80) .aspx

Ví dụ: thử các cách sau:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)

4
Nếu bạn lấy mặc định, trong trường hợp này, bạn sẽ nhận được giá trị thời gian - toàn bộ định dạng cho định dạng 120 là 'yyyy-mm-dd hh: mi: ss'. Bằng cách khai báo rõ ràng độ dài, nó được cắt theo định dạng bạn đã chỉ định trong ghi chú ban đầu của bạn - 'yyyy-mm-dd'.
DaveE

26

Các convertchức năng với format specifier 120 sẽ cung cấp cho bạn các định dạng "dd-MM-dd HH: mm: ss", vì vậy bạn chỉ phải giới hạn độ dài đến 10 để có được chỉ là một phần ngày:

convert(varchar(10), theDate, 120)

Tuy nhiên, định dạng ngày thường tốt hơn để thực hiện trong lớp trình bày hơn là trong cơ sở dữ liệu hoặc lớp doanh nghiệp. Nếu bạn trả về ngày được định dạng từ cơ sở dữ liệu, thì mã máy khách phải phân tích lại ngày đó nếu nó cần thực hiện bất kỳ phép tính nào trên đó.

Ví dụ trong C #:

theDate.ToString("yyyy-MM-dd")

1
Tại sao các downvote? Nếu bạn không giải thích những gì bạn nghĩ là sai, nó không thể cải thiện câu trả lời.
Guffa

14

Đối với YYYYMMDD hãy thử

select convert(varchar,getDate(),112)

Tôi chỉ thử nghiệm trên SQLServer2008.


7

Một cách khác ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 

1
Điều này sẽ tạo ngày 1 chữ số như trong 8/3/2012 nếu bạn muốn 2 chữ số mm / dd bạn cần phải bỏ qua các ngày. RIGHT ('00 '+ CHUYỂN ĐỔI (varchar, DATEPART (yyyy, @datetime)), 2) chẳng hạn
MindStalker

7

Đối với những người muốn có phần thời gian là tốt (tôi đã làm), đoạn trích sau có thể giúp

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                              --example -- 2008-10-02T10:52:47.513

6
replace(convert(varchar, getdate(), 111), '/','-')

Cũng sẽ làm trò lừa mà không "chặt bất cứ thứ gì".


Tôi thích phiên bản này để tránh các lỗi "năm 9999" liên quan đến phiên bản convert (varchar (10) ...).
Phanxicô


5

Trong liên kết cast và convert của bạn, hãy sử dụng kiểu 126, do đó:

CONVERT (varchar(10), DTvalue, 126)

Điều này cắt ngắn thời gian. Yêu cầu của bạn để có nó trong yyyy-mm-dd có nghĩa là nó phải là kiểu dữ liệu chuỗi và datetime.

Thành thật mà nói, tôi sẽ làm điều đó trên máy khách trừ khi bạn có lý do chính đáng để không.


4

Nếu bạn muốn sử dụng nó như một ngày thay vì một varcharlần nữa sau đó, đừng quên chuyển đổi lại:

select convert(datetime,CONVERT(char(10), GetDate(),126))

Điều này sẽ không chuyển đổi nó trở lại định dạng mặc định của hệ thống?
Ignas Vyšnia

3

Tôi không chắc tại sao cách đơn giản nhất đã bị bỏ qua / bỏ qua trong các câu trả lời ở trên:

SELECT FORMAT(GetDate(),'yyyy-MM-dd');--= 2020-01-02

SELECT FORMAT(GetDate(),'dd MMM yyyy HH:mm:ss');-- = 02 Jan 2020 08:08:08

Tôi thích ngôn ngữ thứ hai bởi vì dù bạn nói ngôn ngữ nào, bạn sẽ hiểu đó là ngày nào!

Ngoài ra, SQL Server luôn 'hiểu' nó khi bạn gửi nó đến quy trình lưu của bạn, bất kể định dạng khu vực nào được đặt trong máy tính - Tôi luôn sử dụng cả năm (yyyy), tên tháng (MMM) và định dạng 24 giờ (vốn HH) hàng giờ trong chương trình của tôi.


2

SELECT CONVERT(NVARCHAR(20), GETDATE(), 23)


1
Tại sao nên sử dụng NVARCHAR (20)? có thể có nhân vật đặc biệt trong đó?
KM.

Tôi ưu tiên sử dụng UNICODE. Mos trong các dự án của tôi quốc tế ;-)
Dmitri Kouminov

2

Bạn cũng có thể sử dụng. Điều này là bằng cách sử dụng kiểu dữ liệu mới DATE. Có thể không hoạt động trong tất cả các phiên bản trước, nhưng được đơn giản hóa rất nhiều để sử dụng trong phiên bản sau.

SELECT CAST(getdate() AS DATE)
SELECT LEFT(CAST(getdate() AS DATE), 7)

1

Tôi sẽ dùng:

CONVERT(char(10),GETDATE(),126)

1
SELECT Code,Description FROM TABLE

-- This will Include only date part of 14th March 2010. Any date with date companents will not be considered.
WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate <= DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

-- This will Include the whole day of 14th March 2010
--WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate < DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

1

Từ SQL Server 2008, bạn có thể làm điều này: CONVERT(date,getdate())


1

Có vẻ không cần thiết để làm bất kỳ điều lạ, nếu bạn muốn ngày của bạn được ngăn cách bằng dấu gạch chéo. Chỉ cần thoát khỏi nó với một dấu gạch chéo ngược. Nếu không, bạn sẽ kết thúc với một dấu chấm.

SELECT FORMAT(GETDATE(),'yyyy\/MM');  

Đã thử nghiệm trên SQL Server 2016


Bạn nên kiểm tra nó cho hiệu suất. FORMAT thường chậm hơn 43 lần so với một CHUYỂN ĐỔI phức tạp.
Jeff Moden

0

Sử dụng câu lệnh CASE cho từng chức năng chuyển đổi / truyền luôn hoạt động với tôi:

Vui lòng thay thế bảngXXXXY bằng tên bảng của bạn và resultDate_dat bằng tên của trường thời gian của bạn trong bảng đó:

SELECT  issueDate_dat, CONVERT(varchar, DATEPART(yyyy, issuedate_dat))  AS issueDateYYYY
, CASE WHEN (len(CONVERT(varchar, DATEPART(mm, issuedate_dat))) < 2) THEN '0' +CONVERT(varchar, DATEPART(mm, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(mm, issuedate_dat)) END AS  issueDateMM
, CASE WHEN (len(CONVERT(varchar, DATEPART(dd, issuedate_dat))) <2) THEN '0' +CONVERT(varchar, DATEPART(dd, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(dd, issuedate_dat)) END AS issueDateDD
FROM            tableXXXXY

Hy vọng điều này là hữu ích. chagbert.


0

Giải pháp này hiệu quả với tôi, đơn giản và hiệu quả (với 126 cũng vậy)

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)

0

Nếu định dạng ngày nguồn của bạn bị rối tung, hãy thử một vài thứ dọc theo dòng:

select
convert(nvarchar(50),year(a.messedupDate))+'-'+
(case when len(convert(nvarchar(50),month(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),month(a.messedupDate))+'-' 
    else convert(nvarchar(50),month(a.messedupDate)) end)+
(case when len(convert(nvarchar(50),day(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),day(a.messedupDate))+'-'
    else convert(nvarchar(50),day(a.messedupDate)) end) 
from messytable a

0
 IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

cmdGetPaymentStatement.Parameters.AddWithValue("@pStartDate", DateTime.Parse("22/12/2017", culture, System.Globalization.DateTimeStyles.AssumeLocal)).IsNullable = true;

Mã ở trên được sử dụng để cung cấp quy trình lưu trữ cho tham số ở dạng mm / dd / yyyy
Raj Kumar
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.