Wie nur das Datum von einem SQL Server DateTime-Datentyp zurückgegeben wird

SELECT GETDATE() 

2008-09-22 15:24:13.790 : 2008-09-22 15:24:13.790

Ich möchte dieses Datum Teil ohne die Zeit Teil: 2008-09-22 00:00:00.000

Wie kann ich das bekommen?

Auf SQL Server 2008 und höher sollten Sie CONVERT bis zum Datum:

 SELECT CONVERT(date, getdate()) 

Bei älteren Versionen können Sie Folgendes tun:

 SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date)) 

beispielsweise

 SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 

gibt mir

 2008-09-22 00:00:00.000 

Vorteile:

  • Keine varchar < -> datetime Konvertierung erforderlich
  • Sie müssen nicht über das locale nachdenken

SQLServer 2008 verfügt nun über einen Datentyp “Datum”, der nur ein Datum ohne Zeitkomponente enthält. Jeder, der SQL Server 2008 und höher verwendet, kann Folgendes tun:

 SELECT CONVERT(date, GETDATE()) 

Bei Verwendung von SQL 2008 und höher:

 select cast(getdate() as date) 

DATEADD und DATEDIFF sind besser als CONVERTING zu Varchar. Beide Abfragen haben den gleichen Ausführungsplan, aber Ausführungspläne betreffen hauptsächlich Datenzugriffsstrategien und offenbaren nicht immer implizite Kosten, die mit der CPU-Zeit verbunden sind, die zur Ausführung aller Teile benötigt wird. Wenn beide Abfragen für eine Tabelle mit Millionen von Zeilen ausgeführt werden, kann die CPU-Zeit mit DateDiff knapp 1/3 der Convert CPU-Zeit betragen!

So zeigen Sie Ausführungspläne für Abfragen an:

 set showplan_text on GO 

Sowohl DATEADD als auch DATEDIFF führen CONVERT_IMPLICIT aus.

Obwohl die CONVERT-Lösung für einige einfacher und einfacher zu lesen ist, ist sie langsamer. Es ist nicht notwendig, auf datetime zurückzuspringen (dies wird implizit vom Server ausgeführt). Es gibt auch keinen wirklichen Bedarf in der DateDiff-Methode für DateAdd danach, da das Integer-Ergebnis auch implizit in datetime zurückkonvertiert wird.


SELECT CONVERT (varchar, MyDate, 101) FROM DatumsTabelle

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101))) |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable])) 

DATEADD AUSWÄHLEN (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM DatumsTabelle

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0)))) |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable])) 

Die Verwendung von FLOOR (), wie @digi vorgeschlagen, hat eine performance, die näher an DateDiff liegt, wird jedoch nicht empfohlen, da der Datentyp datetime beim Floaten und Zurückgeben nicht immer den ursprünglichen Wert liefert.

Denken Sie daran, Jungs: Glauben Sie niemandem. Schau dir die performancesstatistiken an und teste sie selbst!

Seien Sie vorsichtig, wenn Sie Ihre Ergebnisse testen. Wenn Sie viele Zeilen für den Client auswählen, wird der performancesunterschied ausgeblendet, da das Senden der Zeilen über das Netzwerk länger dauert als das Ausführen der Berechnungen. Stellen Sie also sicher, dass die Arbeit für alle Zeilen vom Server ausgeführt wird, aber kein Rowset an den Client gesendet wird.

Es scheint für einige Leute Verwirrung darüber zu geben, wann sich die Cache-Optimierung auf Abfragen auswirkt. Das Ausführen von zwei Abfragen in demselben Batch oder in separaten Batches hat keine Auswirkungen auf das Zwischenspeichern. Sie können den Cache entweder manuell ablaufen lassen oder die Abfragen einfach mehrmals hintereinander ausführen. Jegliche Optimierung für Abfrage 2 würde auch nachfolgende Abfragen beeinflussen. Werfen Sie also die Ausführung 1 aus, wenn Sie möchten.

Hier sind vollständige Testskripte und performancesergebnisse , die belegen, dass DateDiff wesentlich schneller ist als das Konvertieren in Varchar.

 SELECT CONVERT(VARCHAR(10),GETDATE(),111) 
 SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)) 

Sie können die CONVERT function verwenden, um nur das Datum zurückzugeben. Siehe die folgenden Links:

Datums- und Uhrzeitmanipulation in SQL Server 2000

CAST und CONVERT

Die Syntax für die Verwendung der Konvertierungsfunktion lautet:

 CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 

Für die Rückgabe im Datumsformat

CAST (Bestelldatum AS-Datum)

Der obige Code funktioniert in SQL Server 2010

Es wird wie 12/12/2013 zurückkehren

Verwenden Sie für SQL Server 2012 den folgenden Code

 CONVERT(VARCHAR(10), OrderDate , 111) 

Verwenden Sie FLOOR () – nur Schnittzeit Teil.

 SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) 
 SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011 SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011 SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21 SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011 

Wenn Sie CONVERT verwenden und dieselbe Ausgabe wie in der ursprünglichen Frage erhalten möchten, also JJJJ-MM-TT, dann verwenden Sie CONVERT(varchar(10),[SourceDate as dateTime],121) gleichen Code wie die vorherigen Antworten , aber der Code, der mit Strichen in JJJJ-MM-TT konvertiert werden soll, ist 121.

Wenn ich für eine Sekunde in meine Soapbox einsteigen kann, gehört diese Art der Formatierung nicht in die Datenebene , und deshalb war es nicht möglich, ohne dumme, hohe Overhead- “Tricks” bis zu SQL Server 2008, wenn es sich um aktuelle Dateitart-Datentypen handelt eingeführt. Wenn Sie solche Konvertierungen in der Datenebene durchführen, ist dies eine enorme Verschwendung von Aufwand für Ihr DBMS. Noch wichtiger ist jedoch, dass Sie in der zweiten Phase verwaist Daten erstellt haben, von denen ich annehme, dass Sie dann zu einem Programm zurückkehren. Sie können es nicht wieder in eine andere 3NF + -Spalte einfügen oder es mit einem anderen Typ vergleichen, ohne es rückgängig zu machen. Sie haben also nur Fehlerpunkte eingeführt und relationale Referenzen entfernt.

Sie sollten IMMER fortfahren und Ihren DateTime-Datentyp an das aufrufende Programm zurückgeben und in der PRÄSENTATION-Ebene die erforderlichen Anpassungen vornehmen. Sobald Sie Dinge konvertieren, bevor Sie sie an den Aufrufer zurückgeben, entfernen Sie alle Hoffnung auf referentielle Integrität aus der Anwendung. Dies würde wiederum eine UPDATE- oder DELETE-Operation verhindern, es sei denn, Sie führen eine manuelle Umkehrung durch, was wiederum Ihre Daten einem menschlichen / Code / Gremlin-Fehler aussetzt, wenn dies nicht notwendig ist.

 SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0) SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE())) SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101)) 

Bearbeiten: Die ersten beiden Methoden sind im Wesentlichen die gleichen, und führen Sie die Konvertierung in Varchar-Methode aus.

Um das angezeigte Ergebnis zu erhalten, verwende ich den folgenden Befehl.

 SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE())) 

Ich halte es für nützlich.

Wenn Sie SQL Server 2012 oder höher verwenden ,

Verwenden Sie die function Format() .

Es gibt bereits mehrere Antworten und Formatierungstypen für SQL Server. Aber die meisten Methoden sind etwas mehrdeutig und es wäre schwierig für Sie, sich die Zahlen für den Formattyp oder die functionen in Bezug auf das spezifische Datumsformat zu merken. Deshalb gibt es in den nächsten Versionen von SQL Server eine bessere Option.

 FORMAT ( value, format [, culture ] ) 

Die Option “Kultur” ist sehr nützlich, da Sie das Datum gemäß Ihren Zuschauern angeben können.

Sie müssen sich an d (für kleine Muster) und D (für lange Muster) erinnern.

1. “d” – Kurzes Datumsmuster.

 2009-06-15T13:45:30 -> 6/15/2009 (en-US) 2009-06-15T13:45:30 -> 15/06/2009 (fr-FR) 2009-06-15T13:45:30 -> 2009/06/15 (ja-JP) 

2. “D” – langes Datumsmuster.

 2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US) 2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU) 2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE) 

Weitere Beispiele in der Abfrage.

 DECLARE @d DATETIME = '10/01/2011'; SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result' ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result' ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result' ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result' ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result' ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result' ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result'; US English Result Great Britain English Result German Result Simplified Chinese (PRC) Result ---------------- ----------------------------- ------------- ------------------------------------- 10/1/2011 01/10/2011 01.10.2011 2011/10/1 US English Result Great Britain English Result German Result Chinese (Simplified PRC) Result ---------------------------- ----------------------------- ----------------------------- --------------------------------------- Saturday, October 01, 2011 01 October 2011 Samstag, 1. Oktober 2011 2011年10月1日 

Wenn Sie mehr Formate wünschen, können Sie gehen zu:

  1. Standardformat für Datum und Uhrzeit
  2. Benutzerdefinierte Formatvorlagen für Datum und Uhrzeit
  Convert(nvarchar(10), getdate(), 101) ---> 5/12/14 Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014 

Wenn Sie in Varchar-Datentyp Ergebnis benötigen, sollten Sie durchlaufen

 SELECT CONVERT(DATE, GETDATE()) --2014-03-26 SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26 

das ist bereits oben erwähnt

Wenn Sie ein Datums- und Uhrzeitformat benötigen, sollten Sie eine der folgenden Abfragen durchführen

1) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111)) als OnlyDate –2014-03-26 00: 00: 00.000

2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) als OnlyDate –2014-03-26 00: 00: 00.000

3)

  DECLARE @OnlyDate DATETIME SET @OnlyDate = DATEDIFF(DD, 0, GETDATE()) SELECT @OnlyDate AS OnlyDate 

–2014-03-26 00: 00: 00.000

Wenn Sie die Ergebnisse einer Spalte oder einer Variablen zuweisen, geben Sie ihr den Typ DATE und die Konvertierung ist implizit.

 DECLARE @Date DATE = GETDATE() SELECT @Date --> 2017-05-03 

Ich denke, das würde in Ihrem Fall funktionieren:

 CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate //here date is obtained as 1990/09/25 

Okay, obwohl ich etwas spät bin :), Hier ist die andere Lösung.

 SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME) 

Ergebnis

 2008-09-22 00:00:00.000 

Und wenn Sie SQL Server 2012 und höher verwenden, können Sie die function FORMAT() wie FORMAT() :

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

Sogar mit dem alten MSSQL Server 7.0, der Code hier (mit freundlicher Genehmigung von diesem Link ) erlaubte mir, welches Datumsformat ich gerade suchte:

 PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE()) PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10) PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106) PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113) 

Es produziert diese Ausgabe:

 1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015 1:14PM 2) Date/time in format MM-DD-YY: 02-27-15 3) Date/time in format MM-DD-YYYY: 02-27-2015 4) Date/time in format DD MON YYYY: 27 Feb 2015 5) Date/time in format DD MON YY: 27 Feb 15 6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630 
 DECLARE @yourdate DATETIME = '11/1/2014 12:25pm' SELECT CONVERT(DATE, @yourdate) 

Ich bevorzuge Folgendes, was nicht erwähnt wurde:

 DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime)) 

Es kümmert sich auch nicht um lokale oder double konvertieren – obwohl jedes ‘datepart’ wahrscheinlich Mathematik tut. Es mag also etwas langsamer sein als die datediff Methode, aber für mich ist es viel klarer. Vor allem, wenn ich nur nach Jahr und Monat gruppieren möchte (setze den Tag auf 1).

Datum:

 SELECT CONVERT (Datum, GETDATE ())
 SELECT CAST (GETDATE () als Datum)

Zeit:

 SELECT CONVERT (Zeit, GETDATE (), 114)
 SELECT CAST (GETDATE () als Zeit)

Ab SQL Server 2012 können Sie dies tun:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

Auf SQL Server 2000

 CAST( ( STR( YEAR( GETDATE() ) ) + '/' + STR( MONTH( GETDATE() ) ) + '/' + STR( DAY( GETDATE() ) ) ) AS DATETIME) 

warum verwendest du DATE_FORMAT nicht (your_datetiem_column, ‘% d-% m-% Y’)?

EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

Sie können die Reihenfolge von m, d und Jahr ändern, indem Sie den '%d-%m-%Y' neu anordnen

Dies fehlte in allen Antworten, ist vielleicht nicht die effizienteste, aber sehr einfach zu schreiben und zu verstehen, kein Stil benötigt, keine komplexen Datumsfunktionen.

 SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE())))) 

Sie können Folgendes für das Datum und die Formatierung des Datums verwenden:

DATENAME => Gibt eine Zeichenfolge zurück, die den angegebenen Datumsteil des angegebenen Datums darstellt

DATEADD => Die DATEPART() -function wird verwendet, um einen einzelnen Teil eines Datums / einer Uhrzeit zurückzugeben, z. B. Jahr, Monat, Tag, Stunde, Minute usw.

DATEPART => Gibt eine Ganzzahl zurück, die den angegebenen Datumsteil des angegebenen Datums darstellt.

CONVERT() => Die function CONVERT() ist eine allgemeine function, die einen Ausdruck eines Datentyps in einen anderen konvertiert. Die function CONVERT() kann verwendet werden, um Datums- / CONVERT() in verschiedenen Formaten anzuzeigen.

Datum (Datum und Uhrzeit) und DATE_FORMAT (Datum und Uhrzeit, “% Y-% m-% d”) geben beide nur das Datum von Datum und Uhrzeit zurück

Ich weiß, dass das alt ist, aber ich sehe nicht, wo es jemand so ausgedrückt hat. Soweit ich das beurteilen kann, ist dies der ANSI-Standard.

 SELECT CAST(CURRENT_TIMESTAMP AS DATE) 

Es wäre gut, wenn Microsoft auch die ANSI-Standardvariable CURRENT_DATE unterstützen könnte.