SQL中datetime列默认值设置问题:如何保留系统时间而非归零为00:00:00
解决datetime列默认值丢失时间部分的问题
直接用GETDATE()-1的写法有时候会触发隐式类型转换,导致时间部分被截断归零,换成专门的日期运算函数就能搞定这个问题。
正确的默认值设置方案
不管是修改已有表还是创建新表,都用DATEADD函数来定义默认值,它能严格保留时间部分:
-- 修改已有表的列默认值 ALTER TABLE YourTableName ALTER COLUMN [date] DATETIME DEFAULT DATEADD(day, -1, GETDATE()); -- 创建新表时直接定义 CREATE TABLE YourTableName ( -- 其他列的定义... [date] DATETIME DEFAULT DATEADD(day, -1, GETDATE()) );
为什么原来的写法会出问题?
虽然理论上GETDATE()-1应该是对完整的datetime值减1天,但在某些场景下,数据库会把运算结果先隐式转换成DATE类型(只保留日期),再转回DATETIME,这就导致时间部分被自动填充为00:00:00。而DATEADD是专门针对日期时间的运算函数,会完整保留GETDATE()的时分秒信息,只对日期做减法操作。
效果验证
假设当前系统时间是2021-09-04 17:44:16.303,使用DATEADD(day, -1, GETDATE())得到的结果就是2021-09-03 17:44:16.303,时间部分完全保留,不会被截断。
内容的提问来源于stack exchange,提问作者steve_mc
相关产品推荐
相关产品推荐

