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?
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?
Antworten:
Ab SQL Server 2008
und höher sollten Sie CONVERT
auf 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:
varchar
<->datetime
Konvertierungen erforderlichlocale
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
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 einfach Convert(varchar(30), @Date, 101)
oder etwas Ähnliches. Weitere Informationen finden Sie in den SQL Server-Online-Büchern • Cast and Convert .
CAST(... AS DATE)
oder CONVERT(DATE, ...)
, was auf dieser Seite ziemlich oft erwähnt wurde.
SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
da sie dann dd
gegen ein anderes datepart
Schlüsselwort ausgetauscht werden kann, um Ihre Antwort datetime
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:
SELECT CONVERT(date, GETDATE())
Bei Verwendung von SQL 2008 und höher:
select cast(getdate() as date)
DateTime2
stattdessen und es funktioniert gut. sqlfiddle.com/#!6/9eecb7/2833
2015-10-01
auf DateTime
Einschränkungen zurückzuführen. Versuchen Sie es ohne Besetzung Date
, es gibt 2015-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:
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.
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.
mm/dd/yyyy
Format.
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)
Mit der CONVERT
Funktion können Sie nur das Datum zurückgeben. Siehe die Links unten:
Datums- und Uhrzeitmanipulation in SQL Server 2000
Die Syntax für die Verwendung der Konvertierungsfunktion lautet:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
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
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014-03-26 00: 00: 00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014-03-26 00: 00: 00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
2014-03-26 00: 00: 00.000
Verwenden Sie FLOOR () - schneiden Sie einfach den Zeitteil ab.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
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.
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)
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 2011年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.
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.
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.
select dateadd(dd, datediff(dd, 0, getdate()), 0)
, da das dd
s dann gegen eines der datepart
Schlüsselwörter ausgetauscht werden kann, um das Datum in einem beliebigen Segment zu beschneiden. (Beachten Sie auch, dass dies dd
nur eine Abkürzung für ist day
.)
Um das angegebene Ergebnis zu erhalten, verwende ich den folgenden Befehl.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Ich holpe es ist nützlich.
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
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
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 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')
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
Datum:
SELECT CONVERT (Datum, GETDATE ()) CAST AUSWÄHLEN (GETDATE () als Datum)
Zeit:
SELECT CONVERT (Zeit, GETDATE (), 114) CAST AUSWÄHLEN (GETDATE () als Zeit)
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
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
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.
select {fn current_date()} as today
funktioniert bei mir.
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).
In diesem Fall, nur Datum, werden wir diese Abfrage ausführen:
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.