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

SQL Server中smalldatetime比较出现30秒偏移的异常问题咨询

关于SQL Server中smalldatetime日期比较出现30秒偏差的原因

嗨,这个问题其实是smalldatetime类型本身的特性导致的,完全不是你的计算逻辑出错哦!

核心原因:smalldatetime的精度限制

SQL Server的smalldatetime类型只精确到30秒,所有存入的时间值都会被自动舍入到最近的30秒间隔中:

  • 当时间在XX:XX:00到XX:XX:29之间时,会被舍入到XX:XX:00
  • 当时间在XX:XX:30到XX:XX:59之间时,会被舍入到XX:XX:30

而当天最后半小时的情况更特殊:如果时间是23:59:31到00:00:29(跨天的这个区间),会直接被舍入到下一天的00:00:00。这就是你看到接近一天结束时比较结果异常的根源——比如你原本以为是当天的时间,实际已经被舍入到了次日,导致比较逻辑和预期不符。

举个验证例子

你可以运行下面的SQL来直观看到这个舍入效果:

-- 会被舍入到次日00:00:00
SELECT CAST('2024-05-20 23:59:31' AS smalldatetime) AS RoundedTime;
-- 结果:2024-05-21 00:00:00

-- 会保留为当天23:59:30
SELECT CAST('2024-05-20 23:59:30' AS smalldatetime) AS RoundedTime;
-- 结果:2024-05-20 23:59:30

解决方案

根据你的需求,可以选择以下两种方式:

  • 改用更高精度的类型:如果需要精确到秒或更细的时间比较,建议替换为datetime(精度3.33毫秒)或者datetime2(最高精度100纳秒),这两种类型不会有30秒的舍入问题。
  • 适配smalldatetime的特性调整查询:如果必须继续使用smalldatetime,在写比较逻辑时要考虑舍入规则。比如要查询"当天"的数据,不要用= '2024-05-20',而是用< '2024-05-21',这样就能包含所有被舍入到当天的时间值(包括23:59:30),同时排除被舍入到次日的部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:14:08