So geben Sie nur das Datum von einem SQL Server DateTime-Datentyp zurück

1778
SELECT GETDATE()

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

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

Wie kann ich das bekommen?

eddiegroves
quelle
4
Wenn Sie einen Datumsdatentyp ohne Uhrzeit abrufen möchten, können Sie, selbst wenn die Uhrzeit 00:00:00 ist, kein Glück haben. Sie können einen Varchar erhalten, aber die Struktur ist eine Datumszeit und Sie haben immer etwas Zeit.
Quintin Robinson
16
Zu beachten ist, dass SQL Server 2008 einen separaten DATE-Datentyp zum Speichern von Datumsangaben ohne Zeitkomponente enthält. Weitere Infos hier: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
Ben Hoffstein
7
Verpassen Sie nicht diesen Beitrag, in dem die Ergebnisse der Leistungstests der verschiedenen Zeitentfernungsmethoden aufgeführt sind.
ErikE
18
Lassen Sie sich nicht von den Stimmen und der akzeptierten Antwort irreführen. Schauen Sie sich stackoverflow.com/a/126984/1155650
Rohit Vipin Mathews an.
8
@Rohit Sie gehen fälschlicherweise davon aus, dass 2008 die einzige Version ist, die die Leute interessiert. (Es gibt mehr Versionen in freier Wildbahn.) Die Stimmen sprechen für sich.
Hktegner

Antworten:

2487

Ab SQL Server 2008und höher sollten Sie CONVERTauf dem Laufenden halten:

SELECT CONVERT(date, getdate())

Bei älteren Versionen können Sie Folgendes tun:

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

zum Beispiel

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

gibt mir

2008-09-22 00:00:00.000

Vorteile:

  • Nein varchar<->datetime Konvertierungen erforderlich
  • Kein Grund zum Nachdenken locale

Wie von vorgeschlagen Michael vorgeschlagen

Verwenden Sie diese Variante: SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

select getdate()

SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))

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

SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))

SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))

Ausgabe:

2019-04-19 08:09:35.557

2019-04-19 08:00:00.000
4763-02-17 00:00:00.000

2019-04-19 00:00:00.000
2019-04-19 00:00:00.000

2019-04-01 00:00:00.000
1903-12-03 00:00:00.000

2019-01-01 00:00:00.000
1900-04-30 00:00:00.000
aku
quelle
52
+1 Sieht so aus, als wäre diese Methode 35% schneller als die üblicherweise verwendete Methode double convert () (die ich auch seit Jahren verwende). Schön.
Däne
8
Der einzige Nachteil, den ich bei Ihrer Lösung sehen kann, ist, dass sie etwas stumpf ist, wenn Sie nicht wissen, was sie tut. Die Verwendung der Doppelkonvertierungsmethode macht Ihre Absichten für zukünftige Code-Betreuer offensichtlicher. Übrigens habe ich dich nicht herabgestimmt. Ich denke, ich werde auch anfangen, Ihre Methode anzuwenden. Vielen Dank @aku
Jim Birchall
38
@pilavdzice Einstellen eine Datumzeit bis Mitternacht dieses Tages nicht wegzulassen DIE ZEIT. Welches Ergebnis erwarten Sie? Der datetimeDatentyp kann überhaupt keine Zeit haben . Ich denke, Sie verwechseln Datenspeicherung mit Benutzerpräsentation. Wenn alles, was Sie wollen, eine Möglichkeit ist, einem Benutzer eine Zeichenfolge anzuzeigen, die keinen Zeitanteil hat (keine Nullen, nur Leerzeichen), dann möchten Sie einfach Convert(varchar(30), @Date, 101)oder etwas Ähnliches. Weitere Informationen finden Sie in den SQL Server-Online-Büchern • Cast and Convert .
ErikE
7
@ user1671639 Der Datetime-Datentyp enthält immer sowohl ein Datum als auch eine Uhrzeit. Sie können keines ohne das andere sinnvoll speichern - es sei denn, Sie verwenden SQL Server 2008. In diesem Fall gibt es auch separate Datums- und Uhrzeitdaten Typen. Wenn Sie CONVERT () so verwenden, möchten Sie wirklich eine Zeichenfolge für die spätere Verwendung, damit Sie nicht weiterkommen - obwohl es besser wäre, wenn Sie Datumsformatierungsfunktionen verwenden, anstatt das Datum abzuschneiden - oder via CAST(... AS DATE)oder CONVERT(DATE, ...), was auf dieser Seite ziemlich oft erwähnt wurde.
Magnus
10
Ich empfehle, die Antwort in zu ändern, SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)da sie dann ddgegen ein anderes datepartSchlüsselwort ausgetauscht werden kann, um Ihre Antwort datetimeauf einer beliebigen Ebene abzuschneiden.
Michael - Wo ist Clay Shirky
717

SQLServer 2008 hat jetzt einen Datentyp 'Datum', der nur ein Datum ohne Zeitkomponente enthält. Jeder, der SQLServer 2008 und höher verwendet, kann Folgendes tun:

SELECT CONVERT(date, GETDATE())
BenR
quelle
41
In SQL2008 gibt es auch den Datentyp 'Zeit', der die andere Hälfte der Frage nach der Trennung von Datum und Uhrzeit beantwortet.
Misteraidan
8
Zu Ihrer Information, ich habe verschiedene Methoden zum Abschneiden der Zeit von Daten verglichen, und dies war die schnellste Methode. Zugegeben, der Unterschied war gering, aber bei einer großen Anzahl von Ausführungen deutlich schneller.
UnhandledExcepSean
2
wt über sqlserver 2005 ??
Dr. MAF
@ Dr.MAF Um den Kreis zu schließen, ist die Antwort vor 2008 hier: stackoverflow.com/questions/113045/…
Frosty840
170

Bei Verwendung von SQL 2008 und höher:

select cast(getdate() as date)
abatishchev
quelle
3
@FredrickGauss: Welcher Typ, Datum? Welche Version von SQL Server verwenden Sie?
Abatishchev
7
In acht nehmen! deklarieren Sie @ date1 datetime = '2015-09-30 20: 59: 59.999'; Besetzung auswählen (@ Datum1 als Datum) gibt '2015-10-01' zurück
Nick
6
@ Nick: Dies ist das Problem mit DateTime. Verwenden Sie DateTime2stattdessen und es funktioniert gut. sqlfiddle.com/#!6/9eecb7/2833
abatishchev
8
@Nick, um die Antwort von abatishchev zu ergänzen, ist Ihr @ date1 in der Tat 2015-10-01auf DateTimeEinschränkungen zurückzuführen. Versuchen Sie es ohne Besetzung Date, es gibt 2015-10-01auch nach! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01
Frédéric
4
Einer dieser leicht zu merkenden SQL-Tricks. Wie Mike sagt, erst 2008, aber wenn Sie irgendwo eine 2005 und frühere DB finden, können Sie viele Probleme haben :)
NicVerAZ
73

DATEADD und DATEDIFF sind besser als die Konvertierung in varchar. Beide Abfragen haben denselben Ausführungsplan, aber bei Ausführungsplänen geht es hauptsächlich um Daten und nicht immer implizit Kosten in der CPU - Zeit beteiligt offenbaren genommen alle die Stücke durchzuführen. Wenn beide Abfragen für eine Tabelle mit Millionen von Zeilen ausgeführt werden, kann die CPU-Zeit mit DateDiff nahe bei 1/3 der CPU-Konvertierungszeit liegen!

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

set showplan_text on
GO 

Sowohl DATEADD als auch DATEDIFF führen ein CONVERT_IMPLICIT aus.

Obwohl die CONVERT-Lösung für einige einfacher und leichter zu lesen ist, ist sie langsamer. Es ist nicht erforderlich, auf datetime zurückzugreifen (dies wird implizit vom Server durchgeführt). Es gibt auch keine wirkliche Notwendigkeit in der DateDiff-Methode für DateAdd danach, da das ganzzahlige Ergebnis auch implizit zurück in datetime konvertiert wird.


SELECT CONVERT (varchar, MyDate, 101) FROM DatesTable

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

SELECT DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM DatesTable

  |--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 von @digi vorgeschlagen, hat eine Leistung, die näher an DateDiff liegt, wird jedoch nicht empfohlen, da das Umwandeln des Datetime-Datentyps in float und back nicht immer den ursprünglichen Wert ergibt.

Denken Sie daran, Jungs: Glauben Sie niemandem. Schauen Sie sich die Leistungsstatistik an und testen Sie sie selbst!

Seien Sie vorsichtig, wenn Sie Ihre Ergebnisse testen. Durch Auswahl vieler Zeilen für den Client wird der Leistungsunterschied ausgeblendet, da das Senden der Zeilen über das Netzwerk länger dauert als das Durchführen der Berechnungen. Stellen Sie daher sicher, dass die Arbeit für alle Zeilen vom Server ausgeführt wird, aber kein Rowset an den Client gesendet wird.

Einige Leute scheinen verwirrt darüber zu sein, wann sich die Cache-Optimierung auf Abfragen auswirkt. Das Ausführen von zwei Abfragen im selben Stapel oder in separaten Stapeln hat keine Auswirkungen auf das Caching. Sie können den Cache also entweder manuell ablaufen lassen oder die Abfragen einfach mehrmals hin und her ausführen. Jede Optimierung für Abfrage Nr. 2 würde sich auch auf nachfolgende Abfragen auswirken. Wenn Sie möchten, werfen Sie also Ausführung Nr. 1 aus.

Hier finden Sie vollständige Testskripte und Leistungsergebnisse , die belegen, dass DateDiff wesentlich schneller ist als die Konvertierung in varchar.

Ricardo C.
quelle
Ricardo C, nette Untersuchung! Welche Version von SQL Server verwenden Sie? Auf MSSQL2000 führt die Methode mit Datediff für mich etwas schneller aus.
Aku
Zu beachten ist, dass ich den Test 1000.000 Mal durchgeführt habe. Für reale Szenarien wird der Leistungsunterschied vermutlich nicht spürbar sein
aku
Aku, ich habe SQL Server 2005 Express für diesen Test verwendet. Ich arbeite an 2000 bei der Arbeit und werde es mit einer Tabelle mit über 24 Millionen Zeilen testen und sehen, was dabei herauskommt.
Ricardo C
Aku, gleiche Ergebnisse. Kein Leistungsunterschied über zehn Millionen Zeilen.
Ricardo C
5
Die Behauptungen über gleiche Leistung sind nicht wahr. Natürlich werden die Ausführungspläne gleich sein !!! Das Messen der Leistung auf diesen MUSS durch Vergleichen der CPU-Auslastung erfolgen, ohne Ausführungspläne zu untersuchen.
ErikE
51

Versuche dies:

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

Die obige Anweisung konvertiert Ihr aktuelles Format in YYYY/MM/DD. Bitte klicken Sie auf diesen Link , um Ihr bevorzugtes Format auszuwählen.

Nescio
quelle
5
Dies gibt '2008/09/22' für mich zurück
eddiegroves
1
SELECT CONVERT (VARCHAR (10), GETDATE (), 101) ist das mm/dd/yyyyFormat.
Floh
4
Wenn Sie nach dem
Rohtextwert
40
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Cade Roux
quelle
21

Zur Rückgabe im Datumsformat

CAST (Bestelldatum AS Datum)

Der obige Code funktioniert in SQL Server 2010

Es wird wie am 12.12.2013 zurückkehren

Verwenden Sie für SQL Server 2012 den folgenden Code

CONVERT(VARCHAR(10), OrderDate , 111)
Mahesh ML
quelle
1
Dies gibt mir Datum mit Null Zeit zurück, nicht nur Datum
Böhmisch
1
Kann ich wissen, welche Version wenn SQL Server Sie verwenden?
Mahesh ML
1
@ MaheshML gibt es Datum und Uhrzeit in MS SQL 2012 zurück.
Marek
1
Funktioniert wie ein Zauber in SQL Azure
Martín Coll
5
@ MaheshML Es gibt keinen SQL Server 2010.
SvenAelterman
16

Wenn Sie das Ergebnis als benötigen varchar, sollten Sie durchgehen

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

das ist schon oben erwähnt.

Wenn Sie ein Ergebnis im Datums- und Uhrzeitformat benötigen, sollten Sie eine der folgenden Abfragen verwenden

  1. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate 

    2014-03-26 00: 00: 00.000

  2. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS 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

Stephon Johns
quelle
14
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
Rushda
quelle
13

Verwenden Sie FLOOR () - schneiden Sie einfach den Zeitteil ab.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
DiGi
quelle
4
Diese Methode ist nicht die schnellste und lehrt die Leute implizit, dass das Umsetzen von Daten zum Float korrekt ist, was nicht der Fall ist. Bitte lesen Sie diesen Beitrag für weitere Details.
ErikE
13

Wenn Sie SQL Server 2012 oder höher verwenden ,

Verwenden Format() Sie Funktion.

Es gibt bereits mehrere Antworten und Formatierungstypen für SQL Server. Die meisten Methoden sind jedoch etwas mehrdeutig, und es fällt Ihnen schwer, sich die Zahlen für den Formattyp oder die Funktionen in Bezug auf das spezifische Datumsformat zu merken. Aus diesem Grund gibt es in den nächsten Versionen von SQL Server eine bessere Option.

FORMAT ( value, format [, culture ] )

Die Kulturoption 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 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        2011101

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

  1. Standardzeichenfolgen für Datum und Uhrzeit
  2. Benutzerdefinierte Zeichenfolgen für Datums- und Uhrzeitformat
Somnath Muluk
quelle
12

Wenn Sie CONVERT verwenden und die gleiche Ausgabe wie in der ursprünglich gestellten Frage erhalten möchten, dh JJJJ-MM-TT, verwenden Sie CONVERT(varchar(10),[SourceDate as dateTime],121)denselben Code wie die Antworten der vorherigen Paare, aber der Code, der mit Bindestrichen in JJJJ-MM-TT konvertiert werden soll, lautet 121.

Wenn ich für eine Sekunde auf meine Seifenkiste zugreifen kann, gehört diese Art der Formatierung nicht in die Datenebene , und deshalb war es ohne alberne Tricks mit hohem Overhead bis SQL Server 2008 nicht möglich, wenn die tatsächlichen Datenteil-Datentypen vorliegen eingeführt. Das Durchführen solcher Konvertierungen in der Datenebene ist eine enorme Verschwendung von Aufwand für Ihr DBMS. Noch wichtiger ist jedoch, dass Sie in dem Moment, in dem Sie so etwas tun, im Speicher verwaiste verwaiste 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 mit etwas vergleichen, das ohne Zurücksetzen eingegeben wurde. Sie haben also nur Fehlerquellen eingeführt und relationale Verweise entfernt.

Sie sollten IMMER fortfahren und Ihren dateTime-Datentyp an das aufrufende Programm zurückgeben und in der PRESENTATION-Ebene die erforderlichen Anpassungen vornehmen. Sobald Sie Dinge konvertieren, bevor Sie sie an den Anrufer zurückgeben, entfernen Sie alle Hoffnung auf referenzielle Integrität aus der Anwendung. Dies würde wiederum einen UPDATE- oder DELETE-Vorgang verhindern, es sei denn, Sie führen eine manuelle Umkehrung durch, bei der Ihre Daten erneut einem Human- / Code- / Gremlin-Fehler ausgesetzt werden, wenn dies nicht erforderlich ist.

Focusyn
quelle
1
Außer wenn Sie beispielsweise eine Abfrage wünschen , die alle Datensätze abruft, die einem vom Benutzer angegebenen Datum als Datumsteil eines bestimmten Zeitfelds entsprechen. Viel Glück dabei nur in der Präsentationsschicht. (Sie brauchen keine Konvertierung, Sie können Datumsarithmetik verwenden, aber Sie bekommen die Idee ...)
Andrew Lazarus
1
@ Andrew, warum ist das wichtig? Sie sagen WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);- es gibt absolut keinen Grund, die Zeit aus der Spalte zu entfernen.
Aaron Bertrand
1
@AaronBertrand Das funktioniert nur, wenn die Eingabe @Dateeinen Zeitteil von Null hat. Falls dies nicht der Fall ist, müssen Sie immer noch wissen, wie Sie die Zeiten serverseitig abschneiden. Ich stimme dieser Antwort zu, dass die Formatierung der Präsentationsebene überlassen bleiben sollte, aber ich stimmte nicht der Implikation zu, dass das Verlassen des Formats für das Frontend bedeutet, dass Sie keinen schnellen Weg zum Abschneiden kennen müssen.
Andrew Lazarus
1
@ Andrew Alles was Sie tun müssen, ist den Eingabeparameter DATE zu machen. Mein Punkt ist immer noch, dass Sie niemals eine solche Kürzung auf die Spalte anwenden müssen sollten , obwohl dies der erste Instinkt der meisten Menschen ist.
Aaron Bertrand
1
@AaronBertrand und das setzt voraus, dass Sie die Kontrolle über den Datentyp des Parameters haben. Gut in einer gespeicherten Prozedur, in anderen Situationen nicht möglich. Warum nicht umwandeln, um sicherzustellen, dass der Parameter der Typ ist, den Sie wollen und brauchen?
Andrew Lazarus
10
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 identisch und führen die Konvertierungsmethode in varchar aus.

Gordon Bell
quelle
1
Diese Methoden sind alle großartig, aber welche schlagen Sie vor?
Eddiegroves
3
Beachten Sie, dass die "richtige" Version der beiden Top-Versionen lautet select dateadd(dd, datediff(dd, 0, getdate()), 0), da das dds dann gegen eines der datepartSchlüsselwörter ausgetauscht werden kann, um das Datum in einem beliebigen Segment zu beschneiden. (Beachten Sie auch, dass dies ddnur eine Abkürzung für ist day.)
Michael - Wo ist Clay Shirky
10

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

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

Ich holpe es ist nützlich.

Anderson Silva
quelle
8
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
Ankit Khetan
quelle
7

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
Art Schmidt
quelle
6

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
Bishnu Karki
quelle
6
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
etni
quelle
2
Dieser Vorschlag wurde durch andere Antworten (mehr als einmal) abgedeckt.
Andriy M
6

Okay, obwohl ich etwas spät dran 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 folgende FORMAT()Funktion verwenden:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
Krishnraj Rana
quelle
Ihr erstes Beispiel hat noch eine Zeitkomponente. Der Punkt der Frage war, wie man das entfernt.
Zack
5

Selbst mit dem alten MSSQL Server 7.0 konnte ich mit dem Code hier (mit freundlicher Genehmigung dieses Links ) das Datumsformat abrufen, nach dem ich damals gesucht hatte:

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 hat diese Ausgabe erzeugt:

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
tumultous_rooster
quelle
5

Datum:

SELECT CONVERT (Datum, GETDATE ())
CAST AUSWÄHLEN (GETDATE () als Datum)

Zeit:

SELECT CONVERT (Zeit, GETDATE (), 114)
CAST AUSWÄHLEN (GETDATE () als Zeit)
Kris Khairallah
quelle
5

Sie können dies einfach so tun:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Ausgaben als:

2008-09-22 00:00:00.000

Oder einfach so:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

Ergebnis:

Date Part Only
--------------
2013-07-14
Amar Srivastava
quelle
4

Warum verwenden Sie nicht DATE_FORMAT (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'Teil neu anordnen

Janaka R Rajapaksha
quelle
4

Ich weiß, dass dies alt ist, aber ich sehe nicht, wo jemand es 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.

zündete
quelle
select {fn current_date()} as todayfunktioniert bei mir.
Brian
@brianary - Das ist schön, aber es ist nicht ANSI SQL.
beleuchtet
Das ist fair genug und Ihre Antwort ist gut portabel, aber ich dachte, solange wir an T-SQL arbeiten, funktioniert dies auch (und zeigt, dass die Implementierung von ANSI CURRENT_DATE für MS trivial wäre).
Brian
4

Ich bevorzuge Folgendes, was nicht erwähnt wurde:

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

Es ist auch nicht wichtig, lokal zu sein oder eine doppelte Konvertierung durchzuführen - obwohl wahrscheinlich jeder 'Datumsteil' Mathe macht. Es ist vielleicht etwas langsamer als die datierte Methode, aber für mich ist es viel klarer. Besonders wenn ich nur nach Jahr und Monat gruppieren möchte (setze den Tag auf 1).

Gerard ONeill
quelle
4

Ab SQL Server 2012 können Sie Folgendes tun:

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

xbb
quelle
4

Unter SQL Server 2000

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

In diesem Fall, nur Datum, werden wir diese Abfrage ausführen:

SELECT CONVERT (VARCHAR (10), getdate (), 111);Geben Sie hier die Bildbeschreibung ein

Mohammad Neamul Islam
quelle
Dies sollte die akzeptierte Antwort sein.
noobprogrammer
3

Sie können Folgendes für den Datumsteil und die Formatierung des Datums verwenden:

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

DATEADD => Die DATEPART() Funktion wird ein einzelner Teil eines Datums / einer Uhrzeit zurückgegeben, z. B. Jahr, Monat, Tag, Stunde, Minute usw.

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

CONVERT()=> Die CONVERT()Funktion ist eine allgemeine Funktion, die einen Ausdruck eines Datentyps in einen anderen konvertiert. Mit dieser CONVERT()Funktion können Datums- / Uhrzeitdaten in verschiedenen Formaten angezeigt werden.

user1151326
quelle