uhrzeit Wie nur das Datum von einem SQL Server DateTime-Datentyp zurückgegeben wird




sql datum uhrzeit abfragen (24)

SELECT GETDATE()

2008-09-22 15:24:13.790 : 2008-09-22 15:24:13.790

Ich möchte dieses Datum Teil ohne die Zeit Teil: 2008-09-22 00:00:00.000

Wie kann ich das bekommen?


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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

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

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

Ich halte es für nützlich.


SQLServer 2008 verfügt nun über einen Datentyp "Datum", der nur ein Datum ohne Zeitkomponente enthält. Jeder, der SQL Server 2008 und höher verwendet, kann Folgendes tun:

SELECT CONVERT(date, GETDATE())

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

Verwenden Sie FLOOR () - nur Schnittzeit Teil.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)

Wenn Sie SQL Server 2012 oder höher verwenden ,

Verwenden Sie die Funktion Format() .

Es gibt bereits mehrere Antworten und Formatierungstypen für SQL Server. Aber die meisten Methoden sind etwas mehrdeutig und es wäre schwierig für Sie, 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 Option "Kultur" 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 der 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:

  1. Standardformat für Datum und Uhrzeit
  2. Benutzerdefinierte Formatvorlagen für Datum und Uhrzeit

Datum:

SELECT CONVERT(date, GETDATE())
SELECT CAST(GETDATE() as date)

Zeit:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)

DATEADD und DATEDIFF sind besser als CONVERTING zu Varchar. Beide Abfragen haben den gleichen Ausführungsplan, aber Ausführungspläne betreffen hauptsächlich Datenzugriffsstrategien und offenbaren nicht immer implizite Kosten, die mit der CPU-Zeit verbunden sind, die zur Ausführung aller Teile benötigt wird. Wenn beide Abfragen für eine Tabelle mit Millionen von Zeilen ausgeführt werden, kann die CPU-Zeit mit DateDiff knapp 1/3 der Convert CPU-Zeit betragen!

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

set showplan_text on
GO 

Sowohl DATEADD als auch DATEDIFF führen CONVERT_IMPLICIT aus.

Obwohl die CONVERT-Lösung für einige einfacher und einfacher zu lesen ist, ist sie langsamer. Es ist nicht notwendig, auf datetime zurückzuspringen (dies wird implizit vom Server ausgeführt). Es gibt auch keinen wirklichen Bedarf in der DateDiff-Methode für DateAdd danach, da das Integer-Ergebnis auch implizit in datetime zurückkonvertiert 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]))

DATEADD AUSWÄHLEN (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM DatumsTabelle

  |--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 @digi vorgeschlagen, hat eine Leistung, die näher an DateDiff liegt, wird aber nicht empfohlen, da der Datentyp datetime beim Floaten und Zurückgeben nicht immer den ursprünglichen Wert liefert.

Denken Sie daran, Jungs: Glauben Sie niemandem. Schau dir die Leistungsstatistiken an und teste sie selbst!

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

Es scheint für einige Leute Verwirrung darüber zu geben, wann die Cache-Optimierung sich auf Abfragen auswirkt. Das Ausführen von zwei Abfragen in demselben Batch oder in separaten Batches hat keine Auswirkungen auf das Zwischenspeichern. Sie können den Cache entweder manuell ablaufen lassen oder die Abfragen einfach mehrmals hintereinander ausführen. Jegliche Optimierung für Abfrage 2 würde auch nachfolgende Abfragen beeinflussen. Werfen Sie also die Ausführung 1 aus, wenn Sie möchten.

Hier sind vollständige Testskripte und Leistungsergebnisse , die belegen, dass DateDiff wesentlich schneller ist als das Konvertieren in Varchar.


Wenn Sie CONVERT verwenden und dieselbe Ausgabe wie in der ursprünglichen Frage erhalten möchten, also JJJJ-MM-TT, dann verwenden Sie CONVERT(varchar(10),[SourceDate as dateTime],121) gleichen Code wie die vorherigen Antworten , aber der Code, der mit Strichen in JJJJ-MM-TT konvertiert werden soll, ist 121.

Wenn ich für eine Sekunde in meine Soapbox einsteigen kann, gehört diese Art der Formatierung nicht in die Datenebene , und deshalb war es nicht möglich, ohne dumme, hohe Overhead- "Tricks" bis zu SQL Server 2008, wenn es sich um aktuelle Dateitart-Datentypen handelt eingeführt. Wenn Sie solche Konvertierungen in der Datenebene vornehmen, ist dies eine enorme Verschwendung von Aufwand für Ihr DBMS. Noch wichtiger ist jedoch, dass Sie in der zweiten Phase verwaist 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 es mit einem anderen Typ vergleichen, ohne es rückgängig zu machen. Sie haben also nur Fehlerpunkte eingeführt und relationale Referenzen entfernt.

Sie sollten IMMER fortfahren und Ihren DateTime-Datentyp an das aufrufende Programm zurückgeben und in der PRÄSENTATION-Ebene die erforderlichen Anpassungen vornehmen. Sobald Sie Dinge konvertieren, bevor Sie sie an den Aufrufer zurückgeben, entfernen Sie alle Hoffnung 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 Umkehrung durch, was wiederum Ihre Daten einem menschlichen / Code / Gremlin-Fehler aussetzt, wenn dies nicht notwendig ist.


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 in Varchar-Datentyp Ergebnis benötigen, sollten Sie durchlaufen

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 Uhrzeitformat benötigen, sollten Sie eine der folgenden Abfragen durchführen

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


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 oder double konvertieren - obwohl jedes 'datepart' wahrscheinlich Mathematik tut. Es mag also etwas langsamer sein als die datediff Methode, aber für mich ist es viel klarer. Vor allem, wenn ich nur nach Jahr und Monat gruppieren möchte (setze den Tag auf 1).


Sogar mit dem alten MSSQL Server 7.0, der Code hier (mit freundlicher Genehmigung von diesem link ) erlaubte mir, welches Datumsformat ich gerade suchte:

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 produziert 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

Datum (Datum und Uhrzeit) und DATE_FORMAT (Datum und Uhrzeit, "% Y-% m-% d") geben beide nur das Datum von Datum und Uhrzeit zurück


Auf SQL Server 2000

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

Auf SQL Server 2008 und höher sollten Sie CONVERT bis zum Datum:

SELECT CONVERT(date, getdate())

Bei älteren Versionen können Sie Folgendes tun:

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

beispielsweise

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

gibt mir

2008-09-22 00:00:00.000

Vorteile:

  • Keine varchar <-> datetime Konvertierung erforderlich
  • Sie müssen nicht über das locale nachdenken

Sie können Folgendes für das Datum 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 verwendet, um einen einzelnen Teil eines Datums / einer Uhrzeit zurückzugeben, 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. Die Funktion CONVERT() kann verwendet werden, um Datums- / CONVERT() in verschiedenen Formaten anzuzeigen.


SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'

Bei Verwendung von SQL 2008 und höher:

select cast(getdate() as date)

Ab SQL Server 2012 können Sie dies tun:

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


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

Für die Rückgabe im Datumsformat

CAST (Datum des Bestelldatums AS)

Der obige Code funktioniert in SQL Server 2010

Es wird wie 12/12/2013 zurückkehren

Verwenden Sie für SQL Server 2012 den folgenden Code

CONVERT(VARCHAR(10), OrderDate , 111)

Dies fehlte in allen Antworten, ist vielleicht nicht die effizienteste, aber sehr einfach zu schreiben und zu verstehen, kein Stil benötigt, keine komplexen Datumsfunktionen.

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

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




datetime