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.