查询 date = '2016/01/02' 不起作用?

Esr*_*_92 3 t-sql sql-server datetime date sql-server-2014

SQL FIDDLE 演示在这里

我有这样的表结构:

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');
Run Code Online (Sandbox Code Playgroud)

我想运行这个查询:

select Name 
from Department 
where CreateDate = '2016-03-21'
Run Code Online (Sandbox Code Playgroud)

结果返回 0 行。

我认为这是因为表结构中的日期是日期时间,但我尝试这样做,但两者都不适合我:

select Name 
from Department 
where CreateDate like '%2016-03-21%'
Run Code Online (Sandbox Code Playgroud)

结果应该是这样的:

Name
-----
Accounting
IT
Secretary
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到这个结果?

希望我解释清楚,谢谢

Shn*_*ugo 5

您正在将DATETIME值与纯值 DATE进行比较。您必须知道,aDATETIME 包括时间

2016-03-21 11:00:00不等于​2016-03-21

你可以这样比较

CAST(YourDate AS DATE)=CAST('2016-03-21' AS DATE)
Run Code Online (Sandbox Code Playgroud)

提示:作为一个微小的例外!-CAST(someCol AS DATE)实际上是可控制的,但值得一提的是,这仍然不是最好的主意:dba.stackexchange.com/a/34052/70663

或者你可以尝试BETWEEN

YourDate BETWEEN {d'2016-03-21'} AND {ts'2016-03-21 23:59:59'}
Run Code Online (Sandbox Code Playgroud)

或 - 在大多数情况下这是最优选的

YourDate >= {d'2016-03-21'} AND YourDate < {d'2016-03-22'}
Run Code Online (Sandbox Code Playgroud)

避免由于可控制性而对列值进行操作

最好避免使用日期文字...如果必须的话,您可以阅读此内容