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.

Kinze
quelle
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.

Darrel Miller
quelle
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
Imran
quelle
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')

Ignas Vyšnia
quelle
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)
John Sansom
quelle
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")
Guffa
quelle
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.

LosManos
quelle
7

Ein anderer Weg ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 
Athadu
quelle
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
user2431693
quelle
6
replace(convert(varchar, getdate(), 111), '/','-')

Wird auch Trick machen, ohne "etwas abzuhacken".

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

Für den Fall, dass jemand es umgekehrt machen möchte und dies findet.

select convert(datetime, '12.09.2014', 104)

Dadurch wird eine Zeichenfolge im deutschen Datumsformat in ein Datum / Uhrzeit-Objekt konvertiert.

Warum 104? Siehe hier: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Jenny O'Reilly
quelle
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.

gbn
quelle
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))
Wayne Evans
quelle
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.

Hannington Mambo
quelle
2

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

Dmitri Kouminov
quelle
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)
Sams
quelle
1

Ich würde ... benutzen:

CONVERT(char(10),GETDATE(),126)
KM.
quelle
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
quelle
1

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

Asher
quelle
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

cuilster
quelle
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.

Chagbert
quelle
0

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

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)
anfehernandez94
quelle
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
CArnold
quelle
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
quelle
Der obige Code wird verwendet, um eine Speicherprozedur für Parameter in Form von MM / TT / JJJJ bereitzustellen
Raj Kumar