Wie erhalte ich ein Datum im Format JJJJ-MM-TT aus einem TSQL-Datum / Uhrzeit-Feld?


259

Wie rufe ich ein Datum im YYYY-MM-DDFormat von SQL Server ab ? Ich brauche dies, um mit SQL Server 2000 und höher zu arbeiten. Gibt es eine einfache Möglichkeit, dies in SQL Server durchzuführen, oder wäre es einfacher, es programmgesteuert zu konvertieren, nachdem ich die Ergebnismenge abgerufen habe?

Ich habe CAST und CONVERT in Microsoft Technet gelesen , aber das gewünschte Format ist nicht aufgeführt, und das Ändern des Datumsformats ist keine Option.


Die BOL-Beschreibung für 126 ist etwas verwirrend (ich habe nie eine Erklärung für "T" gefunden).
Nojetlag

Das "T" trennt das Datum von der Uhrzeit. Siehe ISO 8601 auf Wikipedia
krubo

Antworten:


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

Begrenzen der Größe der Varchar-Koteletts der Stundenportion, die Sie nicht möchten.


3
Nein, aber einige Clients haben Probleme mit der festen Länge.
gbn

54
Dieser Beitrag erscheint in Google für die Konvertierung in JJJJMMTT - so dass einer lautet: CONVERT (char (10), GetDate (), 112)
NealWalters

1
Dies hat bei mir nicht funktioniert, Vorschlag oben mit Code 112. Danke @NealWalters
AlexVPerl

4
Die Liste der Ganzzahlcodes für Ausgabestile: msdn.microsoft.com/en-us/library/ms187928.aspx
Ben Fransen

Code 126 ist gut für Daten wie ein Geburtsdatum im Format JJJJ-MM-TT: CONVERT (char (10), pat_dob, 126) als 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
wie man 'm / t / jjjj' statt 'mm / tt / jjjj' bekommt
user_az

Dies ist bei weitem die hilfreichste Antwort.
Daniel

109

Beginnend mit SQL Server 2012 (ursprüngliche Frage ist für 2000):

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


Dies ist die vernünftige und flexible Möglichkeit, Datum / Uhrzeit in neueren SQL-Versionen mit Dotnet-Standardformaten zu ermitteln. Denken Sie daran, den Monat MM groß zu schreiben, um von den Minuten zu unterscheiden. Alle Datums- und Uhrzeitformate
Jim Birch

FORMAT läuft (normalerweise) 43-mal langsamer als CONVERT. Ich empfehle dringend, dass Sie niemals (und ich benutze dieses Wort nicht oft) FORMAT verwenden.
Jeff Moden vor

35

Das Formular, nach dem Sie suchen, ist in der Online-Dokumentation der Bücher aufgeführt.

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

Versuchen Sie beispielsweise Folgendes:

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

4
Wenn Sie die Standardeinstellung übernehmen, erhalten Sie in diesem Fall den Zeitwert. Das gesamte Format für das Format 120 lautet "JJJJ-MM-TT HH: Mi: SS". Indem Sie die Länge explizit angeben, wird sie auf das Format zugeschnitten, das Sie in Ihrer Originalnotiz angegeben haben - 'JJJJ-MM-TT'.
DaveE

26

Die convertFunktion mit dem Formatbezeichner 120 gibt Ihnen das Format "JJJJ-MM-TT HH: MM: SS". Sie müssen also nur die Länge auf 10 beschränken, um nur den Datumsteil zu erhalten:

convert(varchar(10), theDate, 120)

Das Formatieren von Daten ist jedoch im Allgemeinen besser in der Präsentationsschicht als in der Datenbank- oder Geschäftsschicht. Wenn Sie das aus der Datenbank formatierte Datum zurückgeben, muss der Client-Code es erneut auf ein Datum analysieren, wenn Berechnungen erforderlich sind.

Beispiel in C #:

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

1
Warum das Downvote? Wenn Sie nicht erklären, was Sie für falsch halten, kann dies die Antwort nicht verbessern.
Guffa

14

Für JJJJMMTT versuchen

select convert(varchar,getDate(),112)

Ich habe nur auf SQLServer2008 getestet.


7

Ein anderer Weg ...

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

1
Dadurch werden 1-stellige Daten wie am 03.08.2012 erstellt. Wenn Sie 2-stellige mm / dd möchten, müssen Sie die Daten links auffüllen. RECHTS ('00 '+ CONVERT (varchar, DATEPART (yyyy, @datetime)), 2) zum Beispiel
MindStalker

7

Für diejenigen, die auch den Zeitteil wollen (ich tat es), kann das folgende Snippet helfen

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

Wird auch Trick machen, ohne "etwas abzuhacken".


Ich bevorzuge diese Version, um "Jahr 9999" -Fehler zu vermeiden, die mit der Konvertierungsversion (varchar (10) ...) verbunden sind.
Francis Huang


5

Verwenden Sie in Ihrem Cast- und Convert-Link den Stil 126 wie folgt:

CONVERT (varchar(10), DTvalue, 126)

Dies verkürzt die Zeit. Ihre Anforderung, es in JJJJ-MM-TT zu haben, bedeutet, dass es sich um einen Zeichenfolgendatentyp und eine Datumszeit handelt.

Ehrlich gesagt würde ich es auf dem Kunden tun, es sei denn, Sie haben gute Gründe, dies nicht zu tun.


4

Wenn Sie es als Datum anstelle eines varcharspäteren Datums verwenden möchten, vergessen Sie nicht, es zurück zu konvertieren:

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

würde dies nicht zurück in das Systemstandardformat konvertieren?
Ignas Vyšnia

3

Ich bin mir nicht sicher, warum der einfachste Weg in den obigen Antworten ignoriert / weggelassen wurde:

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

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

Ich bevorzuge die zweite, denn egal welche Sprache Sie sprechen, Sie werden verstehen, welches Datum es ist!

Auch SQL Server "versteht" es immer, wenn Sie dies an Ihre Speicherprozedur senden, unabhängig davon, welche regionalen Formate auf den Computern festgelegt sind. Ich verwende immer das Format für das ganze Jahr (JJJJ), den Monat (MMM) und das 24-Stunden-Format (Großbuchstabe HH). für eine Stunde in meiner Programmierung.


2

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


1
Warum NVARCHAR (20) verwenden? könnte es dort Sonderzeichen geben?
KM.

Ich benutze lieber UNICODE. Mos meiner Projekte international ;-)
Dmitri Kouminov

2

Sie können auch verwenden. Dies erfolgt mithilfe des neuen Datentyps DATE. Funktioniert möglicherweise nicht in allen früheren Versionen, ist jedoch in späteren Versionen stark vereinfacht.

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

1

Ich würde ... benutzen:

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

Ab SQL Server 2008 können Sie Folgendes tun: CONVERT(date,getdate())


1

Scheint unnötig, irgendwelche seltsamen Dinge zu tun, wenn Sie möchten, dass Ihr Date durch einen Schrägstrich getrennt wird. Entkomme einfach mit einem Backslash. Andernfalls erhalten Sie einen Punkt.

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

Getestet auf SQL Server 2016


Sie sollten es auf Leistung testen. FORMAT ist in der Regel 43-mal langsamer als ein kompliziertes CONVERT.
Jeff Moden vor

0

Die Verwendung einer CASE-Anweisung für jede der Konvertierungs- / Cast-Funktionen funktioniert bei mir immer:

Bitte ersetzen Sie tableXXXXY durch Ihren Tabellennamen und issueDate_dat durch den Namen Ihres datetime-Felds in dieser Tabelle:

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

Hoffe das war hilfreich. chagbert.


0

Diese Lösung funktioniert für mich einfach und effektiv (mit 126 auch)

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

0

Wenn Ihr Quellendatumsformat völlig durcheinander ist, versuchen Sie Folgendes:

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;

Der obige Code wird verwendet, um eine Speicherprozedur für Parameter in Form von MM / TT / JJJJ bereitzustellen
Raj Kumar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.