You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL WHERE子句使用CAST筛选前一日日期的写法验证

子句行为判定

你给出的子句不会返回过去24小时范围内的记录,但在tblname.SYSTEM_DATE字段带时间分量的常规场景下,也无法正确返回所有昨日自然日的记录,具体逻辑拆解:

  • 右侧计算逻辑:CAST(GETDATE() as date)会将当前时间截断为当日自然日期,时间部分统一置为00:00:00,再通过DATEADD(day, -1, ...)偏移1天,最终得到的是昨日0点的日期时间值,全程没有基于当前时间做24小时范围偏移,因此不会匹配过去24小时的记录。
  • 实际匹配效果完全取决于SYSTEM_DATE的字段类型:
    • 若SYSTEM_DATE为date类型(无时间分量):该写法可正常返回所有自然日为昨日的记录。
    • 若SYSTEM_DATE为datetime/datetime2/smalldatetime这类带时间分量的类型:该写法只会匹配SYSTEM_DATE值恰好等于昨日00:00:00的记录,昨日其他时间点的记录会全部漏匹配。

补充:真正筛选过去24小时范围的写法为WHERE tblname.SYSTEM_DATE >= DATEADD(hour, -24, GETDATE()),和你提供的子句逻辑有本质区别。

正确的昨日全天记录筛选写法

要兼容带时间分量的日期字段,同时保证查询能用到字段上的索引(避免在查询字段上套用函数导致索引失效),推荐用半开区间范围查询:

WHERE
  tblname.SYSTEM_DATE >= DATEADD(day, -1, CAST(GETDATE() AS date))
  AND tblname.SYSTEM_DATE < CAST(GETDATE() AS date)

该写法的覆盖范围是昨日00:00:00到今日00:00:00之前的所有记录,无论SYSTEM_DATE是纯日期类型还是带时间的日期类型,都能准确命中所有属于昨日自然日的数据,不会漏匹配也不会误包含今日数据。

内容的提问来源于stack exchange,提问作者Cheese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:55:01