it-swarm.com.de

Zurückgeben nur des Datums aus einem SQL Server-DateTime-Datentyp

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?

1544
eddiegroves

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: 

  • Keine varchar <-> datetime Konvertierungen erforderlich
  • Keine Notwendigkeit, über locale nachzudenken
2234
aku

SQLServer 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())
679
BenR

Bei Verwendung von SQL 2008 und höher:

select cast(getdate() as date)
154
abatishchev

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.

70
Ricardo C

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.

41
Nescio
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
37
Cade Roux

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

CAST und CONVERT

Die Syntax für die Verwendung der Konvertierungsfunktion lautet: 

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
19
DaveK

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)
17
Mahesh ML

FLOOR () verwenden - Schneiden Sie einfach den Zeitabschnitt aus.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
13
DiGi
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
12
Rushda

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.

11
Focusyn

Wenn Sie SQL Server 2012 oder eine höhere Version verwenden,

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.

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

  1. Standardzeichenfolgen für Datum und Uhrzeit
  2. Benutzerdefinierte Datums- und Uhrzeitformat-Zeichenfolgen
10
Somnath Muluk
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.

10
Gordon Bell

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

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

Ich holpe es ist nützlich.

9
Anderson Silva

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

9
Stephon Johns
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
8
Ankit Khetan

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
7
Art Schmidt

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')
6
Krishnraj Rana

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
6
bishnu karki

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
5
Matt O'Brien
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
5
etni

Ab SQL Server 2012 können Sie dies tun:

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

4
xbb

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

4
Gerard ONeill

Auf SQL Server 2000

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

Datum:

 SELECT CONVERT (Datum, GETDATE ()) 
 SELECT CAST (GETDATE () als Datum) 

Zeit:

 SELECT CONVERT (Zeit, GETDATE (), 114) 
 SELECT CAST (GETDATE () als Zeit) 
4
Kris Khairallah

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
3
Amar Srivastava

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

3

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()))))
3
Imad

Date (Datums- und Uhrzeitfeld) und DATE_FORMAT (Datum & Uhrzeit, '% Y-% m-% d') beide geben nur Datum aus Datum & Uhrzeit zurück 

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

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.

2
user1151326

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.

2
lit

Bei Verwendung von SQL 2008 und höher: SELECT CONVERT(DATE ,GETDATE())

1
Morteza Sefidi

Versuche dies:

SELECT CONVERT(date, GETDATE()) as date
1
Rafiqul Islam

Mein gemeinsamer Ansatz, um Datum ohne Zeitteil zu bekommen .. 

 SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)

 SELECT CAST(GETDATE() AS DATE)
1
Spider

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

1
ChrisM

wähle convert (getdate () als daselect CONVERT (datetime, CONVERT (date, getdate ())) te)

0
mokh223

sie können wie unten für verschiedene Arten der Ausgabe nur für Datum verwenden

  1. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103)) ----- TT/MM/JJJJ

  2. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))------ MM/TT/JJJJ

  3. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))

0
ankit soni
select cast(createddate as date) as derivedate from table 

createdate ist Ihre datetime-Spalte. Dies funktioniert für sqlserver

0
karthik kasubha

SELECT CONVERT (Datum, Datum holen ())

0
Shiraj Momin

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; 
0
Shyam Bhimani

Der einfachste Weg wäre: SELECT DATE(GETDATE())

0
Jithin Joy

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.

0
Aubrey Love

Mein Stil

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
0
CAGDAS AYDIN