SELECT GETDATE()
Rückgabe: 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?
Bei SQL Server 2008
und höher sollten Sie CONVERT
bis heute:
SELECT CONVERT(date, getdate())
In ä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
Pros:
varchar
<-> datetime
Konvertierungen erforderlichlocale
nachzudenkenSQLServer 2008 hat jetzt einen Datentyp 'date', der nur ein Datum ohne Zeitkomponente enthält. Jeder, der SQLServer 2008 oder 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 die Konvertierung in varchar. Beide Abfragen haben den gleichen Ausführungsplan, aber bei den Ausführungsplänen handelt es sich in erster Linie um data - Zugriffsstrategien, die nicht immer implizite Kosten aufzeigen, die mit der CPU-Zeit verbunden sind, die für die Ausführung aller Teile erforderlich ist. Wenn beide Abfragen für eine Tabelle mit Millionen Zeilen ausgeführt werden, kann die CPU-Zeit mit DateDiff fast 1/3 der Konvertierungs-CPU-Zeit betragen!
So sehen Sie Ausführungspläne für Abfragen:
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 lesbarer ist, ist sie is langsamer. Es ist nicht notwendig, auf datetime zurückzugreifen (dies wird implizit vom Server ausgeführt). Es besteht auch keine wirkliche Notwendigkeit in der DateDiff-Methode für DateAdd danach, da das Integer-Ergebnis auch implizit in datetime zurück konvertiert 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]))
SELECT DATEADD (dd, 0, DATEDIFF (dd, 0, MeinDatum)) 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 () als vorgeschlagenem @digi hat eine höhere Leistung als DateDiff, wird jedoch nicht empfohlen, da der Datetime-Datentyp in Float und Back umgewandelt wird und nicht immer den ursprünglichen Wert ergibt.
Erinnern Sie sich an Jungs: Glauben Sie niemandem. Sehen Sie sich die Leistungsstatistik an und testen Sie es selbst!
Seien Sie vorsichtig, wenn Sie Ihre Ergebnisse testen. Wenn Sie viele Zeilen für den Client auswählen, werden die Leistungsunterschiede ausgeblendet, da das Senden der Zeilen über das Netzwerk länger dauert als die Durchführung der Berechnungen. Stellen Sie daher sicher, dass die Arbeit für alle Zeilen vom Server ausgeführt wird, jedoch kein Rowset an den Client gesendet wird.
Es scheint Verwirrung zu geben, wenn sich die Cache-Optimierung auf Abfragen auswirkt. Das Ausführen von zwei Abfragen in demselben Stapel oder in separaten Stapeln hat keine Auswirkungen auf die Zwischenspeicherung. So können Sie den Cache entweder manuell ablaufen lassen oder die Abfragen einfach mehrmals hin und her ausführen. Jede Optimierung für Abfrage Nr. 2 wirkt sich auch auf nachfolgende Abfragen aus. Werfen Sie also die Ausführung Nr. 1 aus, wenn Sie möchten.
Hier sind vollständige Testskripts und Leistungsergebnisse die beweisen, 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 wählen Sie unter diesem Link das gewünschte Format aus.
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Sie können die Funktion CONVERT
verwenden, um nur das Datum zurückzugeben. Siehe den Link (s) unten:
Datums- und Zeitmanipulation in SQL Server 2000
Die Syntax für die Verwendung der Konvertierungsfunktion lautet:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Zur Rückgabe im Datumsformat
CAST (OrderDate 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)
FLOOR () verwenden - Schneiden Sie einfach den Zeitabschnitt aus.
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 möchten und dieselbe Ausgabe wie in der ursprünglichen Frage erhalten möchten, d. H. Yyyy-mm-dd, dann verwenden Sie CONVERT(varchar(10),[SourceDate as dateTime],121)
denselben Code wie das vorherige Paar. Der Code muss jedoch mit Bindestrichen in yyyy-mm-dd umgewandelt werden ist 121.
Wenn ich mich für eine Sekunde in meine Seifenkiste begeben kann, gehörtdiese Art der Formatierung nicht in die Datenschicht, und deshalb war es bis SQL nicht möglich, ohne dumme High-Overhead- "Tricks" Server 2008, wenn die tatsächlichen Datenteil-Datentypen eingeführt werden. Das Durchführen solcher Konvertierungen in der Datenschicht ist eine enorme Verschwendung von Overhead für Ihr DBMS, aber was noch wichtiger ist: Wenn Sie in etwa so etwas tun, haben Sie im Wesentlichen verwaiste Daten im Arbeitsspeicher erstellt, von denen Sie annehmen, dass Sie dann zu einem Programm zurückkehren. Sie können es nicht erneut in eine andere 3NF + -Spalte einfügen oder es mit dem Eingegebenen vergleichen, ohne es rückgängig zu machen. Alles, was Sie getan haben, ist die Einführung von Fehlerpunkten und das Entfernen relationaler Referenzen.
Sie sollten IMMER vorgehen und Ihren dateTime-Datentyp an das aufrufende Programm undin der PRESENTATION-Ebene zurückgeben. Nehmen Sie die erforderlichen Anpassungen vor.Sobald Sie Dinge konvertieren, bevor Sie sie an den Anrufer zurücksenden, entfernen Sie alle Hoffnungen 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 Rücksetzung durch, was wiederum dazu führt, dass Ihre Daten einem menschlichen/code/gremlin-Fehler ausgesetzt werden, wenn dies nicht erforderlich ist.
Verwenden Sie die Funktion Format()
.
Es gibt bereits mehrere Antworten und Formatierungstypen für SQL Server. Die meisten Methoden sind jedoch mehrdeutig und es ist schwierig, sich die Zahlen für den Formattyp oder die Funktionen 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 Kulturoption ist sehr nützlich, da Sie das Datum entsprechend Ihren Zuschauern festlegen können.
Sie müssen d (für kleine Muster) und D (für lange Muster) beachten.
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, gehen Sie zu:
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 gleich und führen die Konvertierung in Varchar-Methode aus.
Um das angegebene Ergebnis zu erhalten, verwende ich den folgenden Befehl.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Ich holpe es ist nützlich.
Wenn Sie den Datentyp varchar benötigen, sollten Sie durchgehen
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 Zeitformat benötigen, sollten Sie eine der folgenden Abfragen durchgehen
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
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 den Typ DATE an, und die Konvertierung ist implizit.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
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 Funktion FORMAT()
wie folgt verwenden:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
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
Selbst wenn Sie den alten MSSQL Server 7.0 verwendet haben, erlaubte es mir der Code hier (mit freundlicher Genehmigung von link ), jedes Datumsformat zu erhalten, 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 produziert:
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)
Ab SQL Server 2012 können Sie dies tun:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
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 Konvertierungen oder um eine doppelte Konvertierung. Es ist zwar etwas langsamer als die Datediff-Methode, aber für mich ist es viel klarer. Vor allem, wenn ich nur nach Jahr und Monat gruppieren möchte (Tag auf 1 setzen).
Auf SQL Server 2000
CAST(
(
STR( YEAR( GETDATE() ) ) + '/' +
STR( MONTH( GETDATE() ) ) + '/' +
STR( DAY( GETDATE() ) )
)
AS DATETIME)
Datum:
SELECT CONVERT (Datum, GETDATE ()) SELECT CAST (GETDATE () als Datum)
Zeit:
SELECT CONVERT (Zeit, GETDATE (), 114) SELECT CAST (GETDATE () als Zeit)
Sie können dies einfach 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 machen:
SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'
Ergebnis:
Date Part Only
--------------
2013-07-14
warum verwenden Sie nicht DATE_FORMAT (Ihre_Datetiem-Spalte '% 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'
-Part neu anordnen
Dies fehlte in allen Antworten, ist möglicherweise nicht die effizienteste, aber sehr einfach zu schreiben und zu verstehen, es wird kein Stil benötigt, keine komplexen Datumsfunktionen.
SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
Date (Datums- und Uhrzeitfeld) und DATE_FORMAT (Datum & Uhrzeit, '% Y-% m-% d') beide geben nur Datum aus Datum & Uhrzeit zurück
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
Sie können Folgendes für den Datumsteil verwenden und das Datum formatieren:
DATENAME => Gibt eine Zeichenfolge zurück, die den angegebenen Datumsteil des angegebenen Datums darstellt
DATEADD => Mit der Funktion DATEPART()
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 Funktion CONVERT()
ist eine allgemeine Funktion, die einen Ausdruck eines Datentyps in einen anderen konvertiert . Mit der Funktion____CONVERT()
können Datums-/Zeitdaten in verschiedenen Formaten angezeigt werden.
Ich weiß, das ist alt, aber ich sehe nicht, wo jemand es so formuliert 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.
Bei Verwendung von SQL 2008 und höher: SELECT CONVERT(DATE ,GETDATE())
Versuche dies:
SELECT CONVERT(date, GETDATE()) as date
Mein gemeinsamer Ansatz, um Datum ohne Zeitteil zu bekommen ..
SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)
SELECT CAST(GETDATE() AS DATE)
Wenn das Datum 2008-09-22 00:00:00.000
anzeigen soll
dann können Sie es mit runden
SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))
Dadurch wird das Datum im Format der Frage angezeigt
wähle convert (getdate () als daselect CONVERT (datetime, CONVERT (date, getdate ())) te)
sie können wie unten für verschiedene Arten der Ausgabe nur für Datum verwenden
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103))
----- TT/MM/JJJJ
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
------ MM/TT/JJJJ
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))
select cast(createddate as date) as derivedate from table
createdate ist Ihre datetime-Spalte. Dies funktioniert für sqlserver
SELECT CONVERT (Datum, Datum holen ())
Sie können einfach den folgenden Code verwenden, um nur den Datumsteil zu erhalten und den Zeitteil in SQL zu vermeiden:
SELECT SYSDATE TODAY FROM DUAL;
Der einfachste Weg wäre: SELECT DATE(GETDATE())
Wow, lass mich nachzählen, wie du das machen kannst. (kein Wortspiel beabsichtigt)
Um die gewünschten Ergebnisse in diesem Format zu erhalten, gehen Sie wie folgt vor:
2008-09-22
Hier sind einige Optionen.
SELECT CAST(GETDATE() AS DATE) AS 'Date1'
SELECT Date2 = CONVERT(DATE, GETDATE())
SELECT CONVERT(DATE, GETDATE()) AS 'Date3'
SELECT CONVERT(CHAR(10), GETDATE(), 121) AS 'Date4'
SELECT CONVERT(CHAR(10), GETDATE(), 126) AS 'Date5'
SELECT CONVERT(CHAR(10), GETDATE(), 127) AS 'Date6'
Daher würde ich vorschlagen, eine auszuwählen, mit der Sie vertraut sind, und diese Methode in allen Ihren Tabellen zu verwenden.
Alle diese Optionen geben das Datum im exakt gleichen Format zurück. Warum hat SQL Server eine solche Redundanz?
Ich habe keine Ahnung, aber sie tun es. Vielleicht kann jemand schlauer als ich diese Frage beantworten.
Hoffe das hilft jemandem.
Mein Stil
select Convert(smalldatetime,Convert(int,Convert(float,getdate())))