Wie kann ich das DATETIME-Feld nur mit dem Datum in Microsoft SQL Server abfragen?


84

Ich habe einen Tabellentest mit einem DATETIMEFeld wie folgt:

ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000

Was ich brauche eine Abfrage, die diese Zeile und jede Zeile mit Datum 19.03.2014 zurückgibt, egal zu welcher Zeit. Ich habe es versucht

select * from test where date = '03/19/2014';

Es werden jedoch keine Zeilen zurückgegeben. Die einzige Möglichkeit, es zum Laufen zu bringen, besteht darin, auch den Zeitanteil des Datums anzugeben:

select * from test where date = '03/19/2014 20:03:02.000';

Antworten:


123

Verwenden Sie den Bereich oder die DateDiff-Funktion

 select * from test 
 where date between '03/19/2014' and '03/19/2014 23:59:59'

oder

 select * from test 
 where datediff(day, date, '03/19/2014') = 0

Andere Optionen sind:

  1. Wenn Sie die Kontrolle über das Datenbankschema haben und die Zeitdaten nicht benötigen, nehmen Sie sie heraus.

  2. oder, wenn Sie es behalten müssen, fügen Sie ein berechnetes Spaltenattribut hinzu, bei dem der Zeitanteil des Datumswerts entfernt wurde ...

Alter table Test Add DateOnly As DateAdd(day, datediff(day, 0, date), 0)

oder in neueren Versionen von SQL Server ...

Alter table Test Add DateOnly As Cast(DateAdd(day, datediff(day, 0, date), 0) as Date)

Dann können Sie Ihre Anfrage wie folgt schreiben:

select * from test 
where DateOnly = '03/19/2014'

Ok, das funktioniert, aber ich habe mich gefragt, ob es einen einfacheren Weg gibt.
Delphirules

Nun, der einzig einfachere Weg ist, Zeitdaten nicht in die Datenbank zu stellen ... oder ein berechnetes Attribut zu erstellen, das den Zeitanteil entfernt und verwendet ... Ich habe meiner Antwort beide Optionen hinzugefügt.
Charles Bretana

Ich befürchtete, dass die DATEDIFF-Methode für Daten wie den 19.04.2014 oder den 19.03.2015 (unerwünscht) true zurückgeben würde, da der "Tag" -Teil dieser Daten derselbe ist (und ich hatte an anderer Stelle Berichte darüber gesehen, dass dies der Fall sein würde auf diese Weise handeln), aber ich habe es gegen eine Datenbank getestet, und es scheint richtig zu funktionieren.
Mono Código

Ja, da die DateDiff()Funktion in all ihren Varianten die Anzahl der Datumsgrenzen berechnet und zurückgibt, die überschritten werden müssen, um von einem Datum zum anderen zu gelangen. Aus diesem Grunde DateDiff(day, '1Jan2016', '31Dec2017 23:259:59')und DateDiff(day, '31Dec2016 23:259:59', '1Jan2017 ') beide Rückkehr 1.
Charles Bretana

55

Einfache Antwort;

select * from test where cast ([date] as date) = '03/19/2014';

Obwohl dies eine gültige Antwort ist, möchte ich darauf hinweisen, dass das Auswerten des Datumsfelds hinter einer Funktion zu Leistungsproblemen führt. Jeder Index auf dem Datum ist nutzlos und die Engine muss jede Zeile auswerten
Jean


7
select * from test 
where date between '03/19/2014' and '03/19/2014 23:59:59'

Das ist wirklich schlecht Antwort. Aus zwei Gründen.

1. Was passiert mit Zeiten wie 23.59.59.700 usw. Es gibt Zeiten, die größer als 23:59:59 und am nächsten Tag sind.

2. Das Verhalten hängt vom Datentyp ab. Die Abfrage verhält sich für die Typen datetime / date / datetime2 unterschiedlich.

Das Testen mit 23: 59: 59.999 macht es noch schlimmer, da Sie je nach Datentyp unterschiedliche Rundungen erhalten.

select convert (varchar(40),convert(date      , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime  , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime2 , '2014-03-19 23:59:59.999'))

- Für Datum ist der Wert 'gehackt'. - Für datetime wird der Wert auf das nächste Datum aufgerundet. (Nächster Wert). - Für datetime2 ist der Wert genau.


6

Dies funktioniert bei mir für MS SQL Server:

select * from test
where 
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;

1

Versuche dies

 select * from test where Convert(varchar, date,111)= '03/19/2014'

1

Sie können dies versuchen

select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';

1
Vielen Dank, aber ich denke, die einfachere Lösung wäre ein Vergleich mit der Zeit, genau wie die vorherige Lösung.
Delphirules

0

Sie können diesen Ansatz verwenden, bei dem der Zeitteil abgeschnitten wird:

select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)

0
-- Reverse the date format
-- this false:
    select * from test where date = '28/10/2015'
-- this true:
    select * from test where date = '2015/10/28'

1
Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu!
ρss

Dies funktioniert nicht, da sich '2015/10/28 00: 00.001' von '2015/10/28' unterscheidet
PedroC88

0

Verwenden Sie dies einfach in Ihrer WHEREKlausel.

Der unten stehende Abschnitt "SubmitDate" ist der Spaltenname. Fügen Sie also Ihren eigenen ein.

Dies gibt nur den "Jahr" -Teil der Ergebnisse zurück, wobei die Minuten usw. weggelassen werden.

Where datepart(year, SubmitDate) = '2017'

0
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'

"col1" ist der Name der Spalte mit Datum und Uhrzeit
<Name der Spalte>. Hier können Sie den Namen nach Bedarf ändern


0
select *
  from invoice
 where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));

0

Es gibt ein Problem mit Datumsangaben und Sprachen. Um dies zu vermeiden, müssen Sie nach Datumsangaben mit diesem Format JJJJMMTT fragen.

Dieser Weg unten sollte laut dem unten stehenden Link der schnellste sein. Ich habe SQL Server 2012 eingecheckt und bin mit dem Link einverstanden.

select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');

-1

Testen Sie diese Abfrage.

SELECT *,DATE(chat_reg_date) AS is_date,TIME(chat_reg_time) AS is_time FROM chat WHERE chat_inbox_key='$chat_key' 
                         ORDER BY is_date DESC, is_time DESC

-1
select * from invoice where TRANS_DATE_D>= to_date  ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date  ('20171031115959','YYYYMMDDHH24MISS');

Ich denke, dies ist Oracle-Syntax, nicht auf SQL Server arbeiten
Ceinmart

-2
SELECT * FROM test where DATEPART(year,[TIMESTAMP]) = '2018'  and  DATEPART(day,[TIMESTAMP]) = '16' and  DATEPART(month,[TIMESTAMP]) = '11'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.