Jak uzyskać datę w formacie RRRR-MM-DD z pola TSQL datetime?

Jak pobrać datę z SQL Server w formacie RRRR-MM-DD? Potrzebuję tego do pracy z SQL Server 2000 i nowszymi. Czy istnieje prosty sposób, aby wykonać to w SQL Server lub byłoby łatwiej przekonwertować go programowo po pobraniu zestawu wyników?

Czytałem CAST i CONVERT w Microsoft Technet, ale format, który chcę, nie jest wymieniony i zmiana formatu daty nie jest opcją.

Author: Kinze, 2009-05-20

20 answers

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

Ograniczenie wielkości kotletów VARCHAR w porcji godzinnej, której nie chcesz.

 361
Author: Darrel Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-20 19:12:43

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

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

 85
Author: Ignas Vyšnia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-21 09:53:22
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
 72
Author: Imran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-08 15:08:27

Formularz, którego szukasz, jest wymieniony w dokumentacji online książek.

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

Na przykład spróbuj:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)
 34
Author: John Sansom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-20 19:08:38

Funkcja convert ze specyfikatorem formatu 120 da ci format "yyyy-MM-dd HH: mm: ss" , więc musisz ograniczyć długość do 10, aby uzyskać tylko część daty:

convert(varchar(10), theDate, 120)

Jednak formatowanie dat jest na ogół lepsze w warstwie prezentacji niż w warstwie bazy danych lub warstwy biznesowej. Jeśli zwrócisz datę sformatowaną z bazy danych, wtedy kod klienta będzie musiał ponownie przetworzyć ją do daty, jeśli będzie musiał wykonać na niej jakiekolwiek obliczenia.

Przykład w C#:

theDate.ToString("yyyy-MM-dd")
 25
Author: Guffa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-10 22:02:51

Dla yyyymmdd try

select convert(varchar,getDate(),112)

Testowałem tylko na SQLServer2008.

 14
Author: LosManos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-26 14:38:36

W inny sposób...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 
 6
Author: Athadu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-03 16:52:42
replace(convert(varchar, getdate(), 111), '/','-')

Zrobi również sztuczkę bez "odcinania czegokolwiek".

 6
Author: Rafael Emshoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-29 09:26:44

Na wypadek, gdyby ktoś chciał to zrobić w drugą stronę i znalazł to.

select convert(datetime, '12.09.2014', 104)

Konwertuje łańcuch znaków w niemieckim formacie daty na obiekt datetime.

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

 6
Author: Jenny O'Reilly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-05 13:33:13

Dla tych, którzy również chcieliby spędzić trochę czasu (ja tak zrobiłem), poniższy fragment może pomóc

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
Author: user2431693,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 12:14:39

W swoim cast i konwertuj link, użyj stylu 126 tak:

CONVERT (varchar(10), DTvalue, 126)

To skraca czas. Twoje wymaganie, aby mieć go w RRRR-mm-dd oznacza, że musi to być string datatype i datetime. Szczerze mówiąc, zrobiłbym to na kliencie, chyba że masz ku temu powody.
 4
Author: gbn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-20 19:06:43

Jeśli chcesz użyć go jako daty zamiast varchar ponownie później, nie zapomnij przekonwertować go z powrotem:

select convert(datetime,CONVERT(char(10), GetDate(),126))
 3
Author: Wayne Evans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-13 19:35:51

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

 2
Author: Dmitri Kouminov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-30 06:02:15

Użyłbym:

CONVERT(char(10),GETDATE(),126)
 1
Author: KM.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-20 19:10:00
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
Author: arun.passioniway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-20 09:26:42

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

 1
Author: Asher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-03 20:38:32

Używanie instrukcji CASE dla każdej z funkcji convert / cast zawsze działa dla mnie:

Proszę zastąpić tableXXXXY nazwą swojej tabeli, a issueDate_dat nazwą Twojego pola datetime 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
Author: Chagbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-08 15:41:28

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

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)
 0
Author: anfehernandez94,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-22 21:35:48

Jeśli format daty źródłowej jest popsuty, spróbuj czegoś w stylu:

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
Author: CArnold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-24 13:42:19
 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;
 0
Author: Raj Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-28 10:14:32