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


SELECT GETDATE()

Kehrt zurück: 2008-09-22 15:24:13.790

Ich möchte dieses Datumsteil ohne den Zeitteil haben: 2008-09-22 00:00:00.000

Wie kann ich das bekommen?


1404
2017-09-22 03:31


Ursprung


Antworten:


Auf SQL Server 2008 und höher, solltest du CONVERT miteinander ausgehen:

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:

  • Nein varchar<->datetime Konvertierungen erforderlich
  • Keine Notwendigkeit, darüber nachzudenken locale

2056
2017-09-22 03:34



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())

657
2017-09-24 13:02



Bei Verwendung von SQL 2008 und höher:

select cast(getdate() as date)

141
2018-01-31 09:44



DATEADD und DATEDIFF sind besser als CONVERTING zu Varchar. Beide Abfragen haben den gleichen Ausführungsplan, aber Ausführungspläne sind in erster Linie Daten Zugriffsstrategien und zeigen nicht immer implizite Kosten, die mit der CPU-Zeit verbunden sind, die benötigt wird, um alle Teile auszuführen. 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 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 Leistung, 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 Leistungsstatistiken 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 Leistungsunterschied 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 ist vollständige Testskript und Leistungsergebnisse Das beweist, dass DateDiff wesentlich schneller ist als das Konvertieren in varchar.


67
2017-09-22 03:33



SELECT CONVERT(VARCHAR(10),GETDATE(),111)

41
2017-09-22 03:33



SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

35
2017-09-22 03:34



Du kannst den ... benutzen CONVERT Funktion, 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 ] ) 

18
2017-12-19 06:48



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)

17
2017-09-22 07:38



Verwenden Sie FLOOR () - nur Schnittzeit Teil.

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

12
2017-09-22 12:21