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ą.

Kinze
źródło
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.

Darrel Miller
źródło
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
Imran
źródło
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')

Ignas Vyšnia
źródło
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)
John Sansom
źródło
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")
Guffa
źródło
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.

LosManos
źródło
7

Jeszcze jeden sposób ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 
Athadu
źródło
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
użytkownik2431693
źródło
6
replace(convert(varchar, getdate(), 111), '/','-')

Zrobi także trick bez „odcinania czegokolwiek”.

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

Na wypadek, gdyby ktoś chciał to zrobić na odwrót i to znalazł.

select convert(datetime, '12.09.2014', 104)

Konwertuje to ciąg znaków w niemieckim formacie daty na obiekt daty i godziny.

Dlaczego 104 Zobacz tutaj: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Jenny O'Reilly
źródło
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ć.

gbn
źródło
4

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

select convert(datetime,CONVERT(char(10), GetDate(),126))
Wayne Evans
źródło
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.

Hannington Mambo
źródło
2

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

Dmitri Kouminov
źródło
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)
Sams
źródło
1

Użyłbym:

CONVERT(char(10),GETDATE(),126)
KM.
źródło
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))
arun.passioniway
źródło
1

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

Asher
źródło
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

cuilster
źródło
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.

Chagbert
źródło
0

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

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)
anfehernandez94
źródło
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
Crnold
źródło
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;
Raj Kumar
źródło
Powyższy kod służy do zapewnienia procedury przechowywania parametru w postaci mm / dd / rrrr
Raj Kumar