SQL Server表日期查询显示错误结果

时间:2018-10-04 15:53:16

标签: sql sql-server tsql datetime

我有一个Sql服务器表,其中包含下面的Date值(10月4日)

enter image description here

现在下面的查询未显示任何结果

  select 
            *
        from [dbo].[TB_AUDIT] TBA 

        where   TBA.ActionDate >= '10/01/2018' and TBA.ActionDate <= '10/04/2018' which is not correct.

但是如果我写   选择             *         来自[dbo]。[TB_AUDIT] TBA

    where   TBA.ActionDate >= '10/01/2018' and TBA.ActionDate <= '10/05/2018' it is returning me all results.

我做错了。

4 个答案:

答案 0 :(得分:3)

如果您没有为DATETIME指定时间分量,SQL Server会将其默认为午夜。因此,在第一个查询中,您要查询所有结果<='2018-10-04T00:00:00.000'。表中的所有数据点都比'2018-10-04T00:00:00.000'大,因此不会返回任何内容。

您想要

TBA.ActionDate >= '2018-10-01T00:00:00.000' and TBA.ActionDate < '2018-10-05T00:00:00.000'`

答案 1 :(得分:3)

此查询存在两个 问题。首先,它使用的是本地化字符串。在我看来,它似乎要求在1月到4月之间进行查询。明确的 date 格式为YYYYMMDDYYYY-MM-DD本身可能无法在SQL Server中工作,因为它仍然受该语言的影响。 ODBC日期文字{d'YYYY-MM-DD'}也可以正常工作。

第二,日期参数没有时间,默认为00:00。尽管存储的日期具有时间元素,这意味着即使识别出date参数,它们也位于搜索范围之外。

查询应更改为:

select 
        *
from [dbo].[TB_AUDIT] TBA 
where   
    cast(TBA.ActionDate as date) between '20181001' and '20181004'

    cast(TBA.ActionDate as date) between {d'2018-10-01'} and {d'2018-10-04'}

通常,将函数应用于字段会阻止服务器使用任何索引。 SQL Server足够聪明,尽管可以将其转换为涵盖整个日期的查询,本质上类似于

where   
    TBA.ActionDate >='2018:10:01T00:00' and TBA.ActionDate <'2018-10-05T00:00:00'

答案 2 :(得分:1)

使用格式正确的日期!

select *
from [dbo].[TB_AUDIT] TBA 
where TBA.ActionDate >= '2018-10-01' and TBA.ActionDate <= '2018-10-04' 

YYYY-MM-DD不仅仅是一个好主意。它是大多数数据库都认可的日期格式的ISO标准。

答案 3 :(得分:0)

仅按日期过滤时,是根据标准的时间。