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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 02:48:12