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?

War es hilfreich?

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

CAST und CONVERT

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:

  1. Datums- und Uhrzeitstandardformatzeichenfolgen
  2. Benutzerdefinierte Datums- und Uhrzeitformat Strings

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ähnt

Wenn 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top