【问题标题】:DateTime filter in SQL ServerSQL Server 中的日期时间筛选器
【发布时间】:2021-11-29 07:18:31
【问题描述】:

我有一个问题

SELECT * 
FROM SAMPLETABLE 
WHERE CAST(CreatedDate AS DATETIME) =  '2020-01-01 09:00:58'

这对我有用。但我在 yyyy-MM-dd hh:ss 中输入了

SELECT * 
FROM SAMPLETABLE 
WHERE CAST(CreatedDate AS DATETIME) =  '2020-01-01 09:00'

返回零记录。如何过滤这些数据?

【问题讨论】:

  • CreatedDate 是 varchar 吗?
  • 它的日期时间...
  • 您需要避免在列上使用CAST,因为您将强制对整个表进行顺序扫描,而不是使用索引。你会想要SELECT * FROM SAMPLETABLE WHERE CreatedDate BETWEEN '2020-01-01 09:00:00' AND '2020-01-01 09:00:59'
  • 虽然@MikeChristensen 会省略2020-01-01 09:00:593 和2020-01-01 09:00:597 的时间。最好使用>= 和< 语法。

标签: sql sql-server tsql


【解决方案1】:

当您比较 datetime 和 datetime 时,将比较整个值(包括小数秒)。只有当两个操作数真的相等时,相等才会给你 true。

当您与字符串进行比较时,SQL Server 将尝试将其中一个值转换为另一个值的数据类型。这称为implicit conversion。对于datetime 和varchar,由于data type precedence,varchar 将被转换为datetime(当找到适当的规则来转换字符串时)。

因此,您不能说任何给定的日期时间值都等于表示日期和时间的任意字符串。

您希望获得2020-01-01 09:00:00.000 和2020-01-01 09:00:59.999 范围内的所有值,但这不是SQL 中日期和时间的工作方式。

如果你有这样的输入,你要么必须解释它们并使用你期望的间隔进行搜索,比如

SELECT * 
FROM SAMPLETABLE 
WHERE CreatedDate >= '2020-01-01 09:00:00.000'
  AND CreatedDate < '2020-01-01 09:01:00.000'

或者您可以将您的日期时间值转换为您获得的字符串格式:

SELECT * 
FROM SAMPLETABLE 
WHERE FORMAT(CreatedDate, 'yyyy-MM-dd HH:mm') =  '2020-01-01 09:00'

第二种方法在大多数 RDBMS(肯定是 SQL Server)中性能较低,因为在字段本身上进行了转换(计算),这将阻止数据库服务器使用所述列上的索引/来帮助所述过滤器。

请注意,如果您的列已经是 datetime,则不必将其强制转换/转换为 datetime。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多