【问题标题】:Sql Server Table date query showing incorrect resultSql Server 表日期查询显示不正确的结果
【发布时间】:2018-10-04 15:53:16
【问题描述】:

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

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

  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] 待定

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

我做错了什么。

【问题讨论】:

  • 是 1 月 10 日还是 10 月 1 日?如果您询问 1 月和 4 月之间的日期,您将不会从 10 月获得结果。不要使用本地化字符串。唯一明确的 date 格式是 YYYYMMDD。明确的日期时间格式是完整的 ISO8601,即YYYY-MM-DDTHH:mm:ss….

标签: sql sql-server tsql datetime


【解决方案1】:

这个查询有两个问题。首先,它使用的是本地化字符串。对我来说,它看起来像是在一月到四月之间要求行。明确的 date 格式是 YYYYMMDDYYYY-MM-DD 本身可能无法在 SQL Server 中工作,因为它仍然受语言的影响。 ODBC 日期文字 {d'YYYY-MM-DD'} 也同样适用。

其次,日期参数没有时间,默认为00:00。存储的日期虽然有一个时间元素,这意味着它们超出了搜索范围,即使日期参数已被识别。

查询应更改为:

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】:

    如果您没有为 DATETIME 指定时间组件,SQL Server 会将其默认为午夜。因此,在您的第一个查询中,您要查询所有结果 &lt;='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'`
    

    【讨论】:

    • 这应该是 half-open intervalActionDate 小于但不等于结束日期 + 1。(基于 OP 第一个查询的明显意图。)
    • @HABO,绝对正确。我很懒,从问题中复制并粘贴来获取字段名称,错过了修改运算符。已编辑,感谢您的 +1。
    【解决方案3】:

    使用格式正确的日期!

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

    YYYY-MM-DD 不仅仅是一个好主意。它是日期格式的 ISO 标准,被大多数数据库识别。

    【讨论】:

    • 在 SQL Server 中,即使 YYYY-MM-DD 也会受到语言环境的影响。This reminded me though ODBC 日期文字也可以使用
    【解决方案4】:

    当您仅按日期过滤时,它是按照标准的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2011-10-02
      相关资源
      最近更新 更多