Jak uzyskać datę w formacie RRRR-MM-DD z pola daty i godziny TSQL?


259

Jak pobrać datę z programu SQL Server w YYYY-MM-DDformacie? Potrzebuję tego do pracy z SQL Server 2000 i nowszymi wersjami. Czy istnieje prosty sposób na wykonanie tego w programie SQL Server, czy też łatwiej byłoby go przekonwertować programowo po pobraniu zestawu wyników?

Przeczytałem CAST i CONVERT na Microsoft Technet, ale żądanego formatu nie ma na liście, a zmiana formatu daty nie jest opcją.


Opis BOL dla 126 jest nieco zamieszany (nigdy nie znalazł wyjaśnienia dla „T”).
nojetlag

„T” oddziela datę od godziny. Zobacz ISO 8601 na Wikipedii
krubo

Odpowiedzi:


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

Ograniczanie wielkości kotłów varchar w części godzinnej, której nie chcesz.


3
Nie, ale niektórzy klienci mają problemy ze stałą długością.
gbn

54
Ten post pojawia się w Google w celu konwersji na RRRRMMDD - tak więc jest to: CONVERT (char (10), GetDate (), 112)
NealWalters

1
Nie działało to dla mnie, powyższe sugestie z kodem 112 działały. Dzięki @NealWalters
AlexVPerl

4
Lista kodów całkowitych dla stylów wyjściowych: msdn.microsoft.com/en-us/library/ms187928.aspx
Ben Fransen

Kod 126 jest dobry dla dat, takich jak data urodzenia w formacie RRRR-mm-dd: CONVERT (char (10), pat_dob, 126) jako 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
jak zdobyć „m / d / rrrr” zamiast „mm / dd / rrrr”
user_az

Jak dotąd jest to najbardziej pomocna odpowiedź.
Daniel

109

Począwszy od SQL Server 2012 (oryginalne pytanie dotyczy 2000):

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


Jest to rozsądny, elastyczny sposób wykonywania daty / godziny w najnowszych wersjach SQL przy użyciu standardowych formatów Dotnet. Pamiętaj o pisaniu wielkimi miesiącami MM w celu odróżnienia od minut. Wszystkie formaty daty i godziny
Jim Brzoza

35

Formularz, którego szukasz, znajduje się w dokumentacji online książek.

http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx

Na przykład spróbuj wykonać następujące czynności:

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

4
Jeśli weźmiesz wartość domyślną, w tym przypadku otrzymasz wartość czasu - cały format dla formatu 120 to „rrrr-mm-dd gg: mi: ss”. Poprzez wyraźne zadeklarowanie długości zostaje on przycięty do formatu określonego w oryginalnej notatce - „rrrr-mm-dd”.
DaveE

26

convertFunkcja ze specyfikacją formatu 120 daje formacie „yyyy-MM-DD hh: mm: ss”, więc po prostu trzeba ograniczyć długość do 10, aby uzyskać tylko część daty:

convert(varchar(10), theDate, 120)

Jednak formatowanie dat jest zazwyczaj lepsze w warstwie prezentacji niż w warstwie bazy danych lub biznesowej. Jeśli zwrócisz datę sformatowaną z bazy danych, kod klienta musi ponownie ją parsować, jeśli będzie musiał wykonać na nim jakiekolwiek obliczenia.

Przykład w języku C #:

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

1
Dlaczego głosowanie negatywne? Jeśli nie wyjaśnisz, co uważasz za złe, nie może poprawić odpowiedzi.
Guffa

14

W przypadku RRRRMMDD spróbuj

select convert(varchar,getDate(),112)

Testowałem tylko na SQLServer2008.


7

Jeszcze jeden sposób ...

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

1
Spowoduje to utworzenie 1-cyfrowych dat, jak w 8/3/2012, jeśli chcesz 2-cyfrowy mm / dd, musisz zostawić pad daty. PRAWO ('00 '+ CONVERT (varchar, DATEPART (rrrr, @datetime)), 2) na przykład
MindStalker

7

Dla tych, którzy chcieliby również część czasu (ja zrobiłem), może pomóc następujący fragment

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

Zrobi także trick bez „odcinania czegokolwiek”.


Wolę tę wersję, aby uniknąć błędów „roku 9999” związanych z wersją konwersji (varchar (10) ...).
Francis Huang


5

W łączu przesyłania i konwersji użyj stylu 126 w ten sposób:

CONVERT (varchar(10), DTvalue, 126)

To skraca czas. Wymaganie posiadania go w formacie rrrr-mm-dd oznacza, że ​​musi to być ciąg typu danych i data / godzina.

Szczerze mówiąc, zrobiłbym to na kliencie, chyba że masz dobre powody, aby tego nie robić.


4

Jeśli chcesz użyć go jako daty zamiast varcharpóźniej, nie zapomnij go przekonwertować:

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

czy to nie przekonwertuje go z powrotem do domyślnego formatu systemu?
Ignas Vyšnia

3

Nie jestem pewien, dlaczego najprostszy sposób został zignorowany / pominięty w powyższych odpowiedziach:

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

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

Wolę ten drugi, ponieważ w jakimkolwiek języku mówisz, zrozumiesz, jaka to data!

Również SQL Server zawsze „rozumie” to, gdy wysyłasz to do procedury składowania, niezależnie od tego, jakie formaty regionalne są ustawione na komputerach - zawsze używam pełnego roku (rrrr), nazwy miesiąca (MMM) i formatu 24-godzinnego (HH) na godzinę w moim programowaniu.


2

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


1
dlaczego warto korzystać z NVARCHAR (20)? czy mogą tam być znaki specjalne?
KM.

Zawsze używam UNICODE. Mos moich projektów międzynarodowych ;-)
Dmitri Kouminov

2

Możesz także użyć. Jest to możliwe przy użyciu nowego typu danych DATE. Może nie działać we wszystkich poprzednich wersjach, ale znacznie uproszczony do użycia w późniejszej wersji.

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


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

Z SQL Server 2008 możesz to zrobić: CONVERT(date,getdate())


1

Nie musisz robić żadnych dziwnych rzeczy, jeśli chcesz, aby twoja randka była oddzielona ukośnikiem. Po prostu uciec z ukośnikiem. W przeciwnym razie skończysz kropką.

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

Testowane na SQL Server 2016


0

Używanie instrukcji CASE dla każdej funkcji konwersji / rzutowania zawsze działa dla mnie:

Zastąp tabelę XXXXY nazwą tabeli i wydaj data_daty nazwą pola daty i godziny w tej tabeli:

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

Mam nadzieję, że to było pomocne. Chagbert.


0

To rozwiązanie działa dla mnie, proste i skuteczne (również z 126)

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

0

Jeśli Twój źródłowy format daty jest zawalony, spróbuj czegoś podobnego do:

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;

Powyższy kod służy do zapewnienia procedury przechowywania parametru w postaci mm / dd / rrrr
Raj Kumar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.