Wie nur das Datum von einem SQL Server-Datetime-Datentyp zurück
-
02-07-2019 - |
Frage
SELECT GETDATE()
Returns: 2008-09-22 15:24:13.790
Ich möchte zu diesem Zeitpunkt teilweise ohne die Zeit Teil: 2008-09-22 00:00:00.000
Wie kann ich das?
Lösung
Auf SQL Server 2008
und höher, sollten Sie auf dem neuesten Stand CONVERT
:
SELECT CONVERT(date, getdate())
Bei älteren Versionen können Sie wie folgt vor:
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:
- Keine
varchar
<->datetime
Konvertierungen erforderlich - Keine Notwendigkeit, über
locale
zu denken
Wie vorgeschlagen von Michael
Mit dieser Variante: SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))
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
Andere Tipps
SQLServer 2008 hat nun einen ‚Datum‘ Datentyp, der nur ein Datum ohne Zeitkomponente enthält. Jeder SQLServer 2008 mit und darüber hinaus können Sie wie folgt vor:
SELECT CONVERT(date, GETDATE())
Wenn SQL 2008 und höher verwenden:
select cast(getdate() as date)
DATEADD und DATEDIFF sind besser als in varchar konvertieren. Beiden Abfragen haben denselben Ausführungsplan, aber Ausführungspläne sind in erste Linie über Daten Zugriffsstrategien und nicht immer implizit Kosten in der CPU-Zeit beteiligt offenbaren genommen, um all Stücke durchzuführen. Wenn beide Abfragen für eine Tabelle mit Millionen von Zeilen ausgeführt werden, die CPU-Zeit DateDiff mit auf 1 / 3rd der Convert CPU Zeit in der Nähe sein!
Um Ausführungspläne für Abfragen finden Sie unter:
set showplan_text on
GO
Sowohl DATEADD und DATEDIFF eine CONVERT_IMPLICIT auszuführen.
Obwohl die CONVERT-Lösung ist einfacher und leichter für einige zu lesen, es ist langsamer. Es besteht keine Notwendigkeit in Datetime zu werfen zurück (dies implizit durch den Server ausgeführt wird). Es gibt auch keine wirkliche Notwendigkeit in der DateDiff Methode für DateAdd später als das ganzzahlige Ergebnis auch implizit zurück in Datetime konvertiert werden.
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]))
FLOOR () verwendet als @digi vorgeschlagen DatDiff hat Leistung näher, ist aber nicht als das Gießen des Datumsdatentypen empfohlen zu schweben und nicht zurück nicht immer den ursprünglichen Wert ergeben.
Denken Sie daran, Jungs: Sie niemandem glauben. Schauen Sie sich die Performance-Statistiken, und testen Sie es selbst!
Seien Sie vorsichtig, wenn Sie Ihre Ergebnisse zu testen. viele Zeilen an den Client wählen, wird die Performance-Unterschied verstecken becauses es länger dauert, um die Zeilen über das Netzwerk zu senden, als es die Berechnungen durchzuführen. So stellen Sie sicher, dass die Arbeit für alle Zeilen, die von dem Server ausgeführt wird, aber es gibt keine rowset an den Client gesendet.
Es scheint für einige Leute zu Verwirrung, wenn Cache-Optimierung beeinflusst Abfragen. Ausführen von zwei Abfragen in der gleichen Charge oder in mehreren Durchgängen hat keine Auswirkungen auf Caching. So können Sie entweder den Cache manuell ablaufen oder einfach die Abfragen hin und her mehrere Male ausgeführt. Jede Optimierung für Abfrage # 2 würde auch alle nachfolgenden Abfragen beeinflussen, so wirft Ausführung # 1, wenn Sie möchten.
Hier volle Testskript und die Leistungsergebnisse die DateDiff beweisen ist wesentlich schneller als in varchar konvertieren.
Versuchen Sie folgendes:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
Die obige Aussage konvertiert Ihr aktuelles Format YYYY/MM/DD
finden Sie auf Link Ihr bevorzugtes Format wählen.
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Sie können die CONVERT
Funktion verwenden Sie nur das Datum zurückzubringen. Siehe den Link (s) unter:
Datum und Uhrzeit Manipulation in SQL Server 2000
Die Syntax für die Verwendung der Funktion convert ist:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Für Rückkehr in das Datumsformat
CAST (Bestelldatum AS Datum)
Der obige Code wird in SQL Server arbeitet 2010
Es wird wie 2013.12.12 zurückkehren
Für SQL Server 2012 verwenden, um den folgenden Code
CONVERT(VARCHAR(10), OrderDate , 111)
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
FLOOR () verwenden -. Gerade geschnitten Zeitteil
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
Wenn Sie mit SQL Server 2012 oder höher Versionen ,
Verwenden Sie Format()
Funktion.
Es gibt bereits mehrere Antworten und Formatierungstypen für SQL Server. Aber die meisten Methoden sind nicht ganz eindeutig, und es wäre schwierig für Sie die Zahlen für Formattyp oder Funktionen in Bezug auf spezifisches Datumsformat zu erinnern. Deshalb in der nächsten Versionen von SQL Server gibt es eine bessere Option ist.
FORMAT ( value, format [, culture ] )
Kultur Option ist sehr nützlich, da Sie das Datum der Ihren Zuschauer angeben.
Sie haben d (für kleine Muster) und D (für lange Muster) zu erinnern.
1 "d" -.. Short date Muster
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" -.. Lange Datum Muster
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 möchten, können Sie unter:
Wenn Sie CONVERT verwenden möchten, und bekommen die gleiche Leistung wie in der ursprünglichen Frage gestellt, das heißt, yyyy-mm-dd dann CONVERT(varchar(10),[SourceDate as dateTime],121)
gleichen Code wie die vorherigen paar Antworten verwenden, aber der Code zu yyyy-mm- konvertieren dd mit Bindestrichen ist 121.
Wenn ich auf meinem Soapbox für eine zweite bekommen, diese Art der Formatierung nicht in der Datenebene gehört , und das ist, warum es nicht möglich war, ohne albern Hochoverhead ‚Tricks‘, bis SQL Server 2008, wenn die tatsächliche Datumsteil Datentypen eingeführt werden. Herstellung solcher Umwandlungen in der Datenebene ist eine riesige Verschwendung von Overhead auf dem DBMS, aber noch wichtiger ist, die zweiten Sie etwas tun, haben Sie im Grunde in-memory verwaiste Daten erstellt, die ich nehme an, Sie werden dann auf ein Programm zurück. Sie können es nicht, dass es bei einer anderen 3NF + Spalte oder vergleichen, ohne Rückgriff auf etwas getippt setzen so alles, was Sie getan haben, ist Fehlerpunkte eingeführt und relationale Referenz entfernt.
Sie sollten immer voran gehen und senden Sie Ihre Datumsdatentyp an das rufende Programm und in der Präsentationsschicht, machen, was Anpassungen notwendig sind. Sobald Sie gehen Umwandlung Dinge, bevor sie an den Aufrufer zurückkehrt, werden Sie alle Hoffnung auf referentielle Integrität der Anwendung zu entfernen. Dies würde eine UPDATE verhindern oder DELETE-Operation, wieder, es sei denn, Sie irgendeine Art von manueller Reversion tun, was wiederum Ihre Daten zu Menschen / code / Gremlin Fehlern ausgesetzt wird, wenn es nicht notwendig ist.
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))
Edit:. Die ersten beiden Methoden sind im Wesentlichen die gleichen sind, und führen Sie das Konvertit varchar Methode
das Ergebnis angezeigt zu erhalten, verwende ich den folgenden Befehl ein.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
I Holpe es nützlich ist.
Wenn Sie in Datentyp varchar führen müssen, sollten Sie gehen durch
SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26
, die bereits oben
erwähntWenn Sie führen müssen Datums- und Uhrzeitformat Sie durch eine der folgenden Abfrage gehen sollte
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 in einer Spalte oder Variablen zuweisen, gibt ihm den DATE-Typen, und die Umwandlung ist implizit.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
Ich denke, dies in Ihrem Fall funktionieren würde:
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 mit SQL Server 2012 und höher als Sie FORMAT()
Funktion wie diese verwenden können -
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
Auch den alten MSSQL Server 7.0 verwendet, wird der Code hier (mit freundlicher Genehmigung von dieser link ) erlaubt mir, was Datumsformat zu bekommen ich suchte damals:
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 erzeugt diese Ausgabe:
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)
Datum:
SELECT CONVERT(date, GETDATE()) SELECT CAST(GETDATE() as date)
Zeit:
SELECT CONVERT(time , GETDATE() , 114) SELECT CAST(GETDATE() as time)
Ich bin für die folgende, die nicht erwähnt wurde:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
Es schert auch nicht über lokale oder eine Doppel convert tun - obwohl jeder ‚Datumsteil‘ wahrscheinlich Mathe tut. So kann es ein wenig langsamer als die datediff Methode sein, aber für mich ist es viel klarer. Vor allem, wenn ich nur das Jahr gruppieren mag und Monat (den Tag auf 1).
Starten von SQL Server 2012, können Sie dies tun:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
Auf SQL Server 2000
CAST(
(
STR( YEAR( GETDATE() ) ) + '/' +
STR( MONTH( GETDATE() ) ) + '/' +
STR( DAY( GETDATE() ) )
)
AS DATETIME)
Einfach können Sie auf diese Weise tun:
SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Ausgänge wie:
2008-09-22 00:00:00.000
Oder einfach tun wie folgt aus:
SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'
Ergebnis:
Date Part Only
--------------
2013-07-14
warum Sie nicht verwenden DATE_FORMAT (your_datetiem_column, '% d-% m-% Y')?
EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name
Sie können Folge von m, d und Jahr ändern, indem Neuanordnung '%d-%m-%Y'
Teil
Ich weiß, das ist alt, aber ich sehe nicht, wo jemand es auf diese Weise angegeben. Von dem, was ich sagen kann, ist dieser ANSI-Standard.
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Es wäre gut, wenn Microsoft auch die ANSI-Standard CURRENT_DATE Variable unterstützen könnte.
Dies wurde in allen Antworten fehlt, ist vielleicht nicht die effizienteste, aber sehr einfach zu schreiben und zu verstehen, kein Stil erforderlich, keine komplexen Datumsfunktionen.
SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
Sie können folgende für Datumsteil verwenden und die Formatierung des Datums:
DATENAME => Gibt eine Zeichenfolge, die den angegebenen Datumsteil des angegebenen Datums repräsentiert
DATEADD => Die DATEPART()
Funktion wird ein einzelnes Teil eines Datum / Zeit zurückzukehren, wie Jahr, Monat, Tag, Stunde, Minute, etc.
DATEPART => Gibt eine Ganzzahl, die den angegebenen Datumsteil des angegebenen Datums darstellt.
CONVERT()
=> Die CONVERT()
Funktion eine allgemeine Funktion, die einen Ausdruck von einem Datentyp in einer anderen umwandelt.
Das
CONVERT()
Funktion verwendet werden kann, Datum / Zeit-Daten in verschiedenen Formaten angezeigt werden soll.