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';
Delphiren
quelle

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'
Charles Bretana
quelle
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';
Kabcha
quelle
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.

Ben
quelle
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 ;
Jeroen Krah
quelle
1

Versuche dies

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

Sie können dies versuchen

select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
Hölle
quelle
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)
Tim Schmelter
quelle
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'
Sherif Hamdy
quelle
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'
user8161541
quelle
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

NGoyal
quelle
0
select *
  from invoice
 where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));
PanSQL
quelle
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');
Mako
quelle
-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
Programer_saeed
quelle
-1
select * from invoice where TRANS_DATE_D>= to_date  ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date  ('20171031115959','YYYYMMDDHH24MISS');
khairollah royesh
quelle
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'
Kalidas
quelle