2016-04-04 8 views
2

SQL FIDDLE DEMO HEREAbfrage wo Datum = '2016/01/02' nicht funktioniert?

Ich habe diese Struktur der Tabelle:

CREATE TABLE Department 
(
    [IdDepartment] int, 
    [Name] varchar(23), 
    [IdUser] int, 
    [CreateDate] datetime 
); 

INSERT INTO Department ([IdDepartment], [Name], [IdUser], [CreateDate]) 
VALUES 
    (1, 'Sales', 3, '2016-01-15 17:00:00.000'), 
    (2, 'Finance', null, '2016-01-13 18:00:00.000'), 
    (3, 'Accounting' , 5, '2016-03-21 22:00:00.000'), 
    (4, 'IT' ,3, '2016-03-21 17:00:00.000'), 
    (5, 'Secretary',null, '2016-03-21 17:00:00.000'), 
    (6, 'Sport',3, '2016-02-20 16:00:00.000'); 

Ich möchte diese Abfrage auszuführen:

select Name 
from Department 
where CreateDate = '2016-03-21' 

Dies gibt Zeilen 0 als Ergebnis.

Ich denke, es liegt daran, dass das Datum in der Tabellenstruktur ein Datetime ist, aber ich versuche, dies und weder Werke für mich zu tun:

Name 
----- 
Accounting 
IT 
Secretary 

:

select Name 
from Department 
where CreateDate like '%2016-03-21%' 

Das Ergebnis dieser sein sollte Wie kann ich dieses Ergebnis erhalten?

Ich hoffe, dass ich deutlich erklärt, dank

Antwort

1

Verwenden CAST Methode Datum zu vergleichen, nicht nur Zeit

SELECT * FROM Department 
WHERE CAST(CreateDate AS DATE) ='2016-03-21' 
+1

Ihr Code korrekt mir funktioniert dank :-D –

+1

@ Esraa_92 Allthough - wie ein winziger Ausnahme! - 'CAST (someCol AS DATE)' eigentlich ** ist ** sargable, es ist erwähnenswert, dass es immer noch nicht die beste Idee zu tun ist: http://dba.stackexchange.com/a/34052/70663 – Shnugo

4

Du einen DATETIME Wert gegen einen reinenDATE zu vergleichen. Sie müssen sich bewusst sein, dass ein DATETIMEumfasst eine Zeit

2016-03-21 11:00:00NICHT gleich 2016-03-21

Sie vergleichen könnte wie dieser

CAST(YourDate AS DATE)=CAST('2016-03-21' AS DATE) 

Tipp ist: Als eine winzige Ausnahme! - CAST(someCol AS DATE) tatsächlich ist sargable, aber es lohnt sich zu erwähnen, dass es nach wie vor nicht die beste Idee ist zu tun: dba.stackexchange.com/a/34052/70663

oder Sie können eine BETWEEN

YourDate BETWEEN {d'2016-03-21'} AND {ts'2016-03-21 23:59:59'} 
versuchen

oder - was die meisten ist

YourDate >= {d'2016-03-21'} AND YourDate < {d'2016-03-22'} 

vermeiden Manipulationen an den Spaltenwert in den meisten Fällen bevorzugt aufgrund sargability

besser vermeiden Datumsliterale ... Wenn Sie haben, können Sie read this

+0

Danke für deine Antwort :-) –

+1

@Shnugo: dieser Mann gibt keine Lösung, er hat Lösung :), jetzt wirst du in Zukunft immer (@ Esraa_92) alarmieren –

0

voll zustimmen @Shnugo

DECLARE @Department TABLE (
    IdDepartment INT, 
    Name VARCHAR(23), 
    IdUser INT, 
    CreateDate DATETIME 
); 

INSERT INTO @Department 
VALUES 
    (1, 'Sales', 3, '2016-01-15 17:00:00'), 
    (2, 'Finance', NULL, '2016-01-13 18:00:00'), 
    (3, 'Accounting', 5, '2016-03-21 22:00:00'), 
    (4, 'IT', 3, '2016-03-21 17:00:00'), 
    (5, 'Secretary', NULL, '2016-03-21 17:00:00'), 
    (6, 'Sport', 3, '2016-02-20 16:00:00') 

DECLARE @Date DATETIME = '20160321' -- ISO format 

SELECT Name 
FROM @Department 
WHERE CreateDate >= @Date 
    AND CreateDate < DATEADD(DAY, 1, @Date)