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.
@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:
+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:
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.
@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
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, 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:
SELECTCONVERT(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.
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.
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.
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/201101/10/201101.10.20112011/10/1
US English Result Great Britain English Result German Result Chinese (Simplified PRC) Result
---------------------------- ----------------------------- ----------------------------- ---------------------------------------
Saturday, October 01,201101 October 2011 Samstag,1. Oktober 20112011年10月1日
Wenn Sie mehr Formate wünschen, können Sie gehen zu:
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.
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?
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.
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 2720151:14PM
2) Date/time in format MM-DD-YY:02-27-153) Date/time in format MM-DD-YYYY:02-27-20154) Date/time in format DD MON YYYY:27 Feb 20155) Date/time in format DD MON YY:27 Feb 156) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H):27 Feb 201513:14:46:630
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).
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).
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.
Antworten:
Ab
SQL Server 2008
und höher sollten SieCONVERT
auf dem Laufenden halten:Bei älteren Versionen können Sie Folgendes tun:
zum Beispiel
gibt mir
Vorteile:
varchar
<->datetime
Konvertierungen erforderlichlocale
Wie von vorgeschlagen Michael vorgeschlagen
Verwenden Sie diese Variante:
SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
Ausgabe:
quelle
datetime
Datentyp 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 einfachConvert(varchar(30), @Date, 101)
oder etwas Ähnliches. Weitere Informationen finden Sie in den SQL Server-Online-Büchern • Cast and Convert .CAST(... AS DATE)
oderCONVERT(DATE, ...)
, was auf dieser Seite ziemlich oft erwähnt wurde.SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
da sie danndd
gegen ein anderesdatepart
Schlüsselwort ausgetauscht werden kann, um Ihre Antwortdatetime
auf einer beliebigen Ebene abzuschneiden.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:
quelle
Bei Verwendung von SQL 2008 und höher:
quelle
DateTime2
stattdessen und es funktioniert gut. sqlfiddle.com/#!6/9eecb7/28332015-10-01
aufDateTime
Einschränkungen zurückzuführen. Versuchen Sie es ohne BesetzungDate
, es gibt2015-10-01
auch nach!declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1
=>2015-10-01
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:
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
SELECT DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM 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.
quelle
Versuche dies:
Die obige Anweisung konvertiert Ihr aktuelles Format in
YYYY/MM/DD
. Bitte klicken Sie auf diesen Link , um Ihr bevorzugtes Format auszuwählen.quelle
mm/dd/yyyy
Format.quelle
Zur Rückgabe im Datumsformat
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
quelle
Mit der
CONVERT
Funktion können Sie nur das Datum zurückgeben. Siehe die Links unten:Datums- und Uhrzeitmanipulation in SQL Server 2000
CAST und CONVERT
Die Syntax für die Verwendung der Konvertierungsfunktion lautet:
quelle
Wenn Sie das Ergebnis als benötigen
varchar
, sollten Sie durchgehendas ist schon oben erwähnt.
Wenn Sie ein Ergebnis im Datums- und Uhrzeitformat benötigen, sollten Sie eine der folgenden Abfragen verwenden
quelle
quelle
Verwenden Sie FLOOR () - schneiden Sie einfach den Zeitteil ab.
quelle
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.
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.
2. "D" - Langes Datumsmuster.
Weitere Beispiele in Abfrage.
Wenn Sie mehr Formate wünschen, können Sie gehen zu:
quelle
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.
quelle
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
- es gibt absolut keinen Grund, die Zeit aus der Spalte zu entfernen.@Date
einen 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.Bearbeiten: Die ersten beiden Methoden sind im Wesentlichen identisch und führen die Konvertierungsmethode in varchar aus.
quelle
select dateadd(dd, datediff(dd, 0, getdate()), 0)
, da dasdd
s dann gegen eines derdatepart
Schlüsselwörter ausgetauscht werden kann, um das Datum in einem beliebigen Segment zu beschneiden. (Beachten Sie auch, dass diesdd
nur eine Abkürzung für istday
.)Um das angegebene Ergebnis zu erhalten, verwende ich den folgenden Befehl.
Ich holpe es ist nützlich.
quelle
quelle
Wenn Sie die Ergebnisse einer Spalte oder Variablen zuweisen, geben Sie ihr den Typ DATE, und die Konvertierung ist implizit.
quelle
Ich denke, das würde in Ihrem Fall funktionieren:
quelle
quelle
Okay, obwohl ich etwas spät dran bin :), hier ist die andere Lösung.
Ergebnis
Und wenn Sie SQL Server 2012 und höher verwenden, können Sie die folgende
FORMAT()
Funktion verwenden:quelle
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:
Es hat diese Ausgabe erzeugt:
quelle
Datum:
Zeit:
quelle
Sie können dies einfach so tun:
Ausgaben als:
Oder einfach so:
Ergebnis:
quelle
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 anordnenquelle
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.
Es wäre gut, wenn Microsoft auch die ANSI-Standardvariable CURRENT_DATE unterstützen könnte.
quelle
select {fn current_date()} as today
funktioniert bei mir.Ich bevorzuge Folgendes, was nicht erwähnt wurde:
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).
quelle
Ab SQL Server 2012 können Sie Folgendes tun:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
quelle
Unter SQL Server 2000
quelle
In diesem Fall, nur Datum, werden wir diese Abfrage ausführen:
SELECT CONVERT (VARCHAR (10), getdate (), 111);
quelle
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()
=> DieCONVERT()
Funktion ist eine allgemeine Funktion, die einen Ausdruck eines Datentyps in einen anderen konvertiert. Mit dieserCONVERT()
Funktion können Datums- / Uhrzeitdaten in verschiedenen Formaten angezeigt werden.quelle