【问题标题】:Query where date = '2016/01/02' not working?查询哪里 date = '2016/01/02' 不起作用?
【发布时间】:2016-07-23 18:59:08
【问题描述】:

SQL FIDDLE DEMO HERE

我有这样的表结构:

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');

我想运行这个查询:

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

这将返回 0 行作为结果。

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

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

结果应该是这样的:

Name
-----
Accounting
IT
Secretary

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

希望我解释清楚,谢谢

【问题讨论】:

    标签: sql-server tsql date datetime sql-server-2014


    【解决方案1】:

    您将DATETIME 值与 DATE 值进行比较。您必须知道,DATETIME 包括一次

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

    你可以这样比较

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

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

    或者你可以试试BETWEEN

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

    or - 在大多数情况下是最喜欢的

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

    避免由于sargability而对列值进行操作

    最好避免使用日期文字...如果必须,您可以read this

    【讨论】:

    • 感谢您的回答 :-)
    • @Shnugo:这个人没有解决问题,他有解决方案:),现在你(@Esraa_92)会一直提醒
    【解决方案2】:

    使用CAST 方法只比较日期而不是时间

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

    【讨论】:

    • @Esraa_92 虽然 - 作为一个小例外! - CAST(someCol AS DATE) 实际上 sargable,值得一提的是,它仍然不是最好的主意:dba.stackexchange.com/a/34052/70663
    【解决方案3】:

    完全同意@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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-29
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 2022-11-15
      • 2016-05-28
      • 1970-01-01
      相关资源
      最近更新 更多