CURRENT_TIMESTAMP 是 SQL Server 中的保留关键字,非函数调用,不可加括号;它是 GETDATE() 的 ANSI 兼容别名,返回 datetime 类型(精度 3.33ms,范围 1753–9999);高精度或 UTC 需用 SYSDATETIME()、GETUTCDATE() 或 SYSUTCDATETIME();用于默认约束或 INSERT 时须注意类型兼容性,且不可在多列默认约束中重复使用。

CURRENT_TIMESTAMP 是 SQL Server 的标准时间函数,但不是函数调用语法
CURRENT_TIMESTAMP 在 SQL Server 中是**保留关键字**,不是真正的函数,所以不能加括号写成 CURRENT_TIMESTAMP() —— 这会报错 Incorrect syntax near '('。它本质是 GETDATE() 的 ANSI SQL 兼容别名,语义和行为完全一致,返回 datetime 类型(精度 3.33ms,范围 1753–9999)。
实际使用时直接写 CURRENT_TIMESTAMP 即可,常见于默认约束或 INSERT 语句:
CREATE TABLE logs (
id INT IDENTITY(1,1),
msg NVARCHAR(200),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
想用更高精度?改用 SYSDATETIME 或 GETUTCDATE
CURRENT_TIMESTAMP 和 GETDATE() 都只支持 datetime,无法满足毫秒级或时区敏感需求。若需微秒级精度(100ns),必须显式用 SYSDATETIME();若需 UTC 时间,应选 GETUTCDATE() 或 SYSUTCDATETIME()。
-
SYSDATETIME()返回datetime2(7),本地时区,精度高,但不能直接作为datetime列的默认值(类型不匹配) - 若列定义为
datetime2,可安全设默认值:created_at DATETIME2 DEFAULT SYSDATETIME() - 跨时区系统建议统一用 UTC:列类型用
datetime2,默认值用SYSUTCDATETIME()
INSERT 时显式插入 CURRENT_TIMESTAMP 要注意类型兼容性
在 INSERT 语句中手动写 CURRENT_TIMESTAMP 没问题,但必须确保目标列类型能容纳它。比如向 date 列插入会隐式截断时间部分,向 datetime2(0) 插入会四舍五入到秒——这些转换不报错,但结果可能不符合预期。
常见错误场景:
- 向
smalldatetime列插入:CURRENT_TIMESTAMP会被舍入到最近一分钟,且丢失秒以下精度 - 列是
date类型却期望带时间:插入成功但时间部分全丢,查出来全是1900-01-01以外的日期,但时间全为00:00:00 - 应用层传字符串如
'2024-05-20'给datetime列:SQL Server 会自动补为'2024-05-20 00:00:00.000',和CURRENT_TIMESTAMP行为不一致
ALTER TABLE 添加默认约束时 CURRENT_TIMESTAMP 不能带参数
给已有表加默认值,语法是 ADD CONSTRAINT ... DEFAULT CURRENT_TIMESTAMP FOR col_name。这里 CURRENT_TIMESTAMP 后面**不能跟任何括号、参数或表达式**,否则报错 Incorrect syntax near 'CURRENT_TIMESTAMP'。
正确写法:
ALTER TABLE logs ADD CONSTRAINT DF_logs_created_at DEFAULT CURRENT_TIMESTAMP FOR created_at;
错误写法(全部无效):
DEFAULT CURRENT_TIMESTAMP()DEFAULT (CURRENT_TIMESTAMP)-
DEFAULT GETDATE()(虽然语义对,但和CURRENT_TIMESTAMP不等价,且违反 ANSI 兼容初衷)
真正容易被忽略的是:SQL Server 不允许在同一个表里对多个列使用 CURRENT_TIMESTAMP 默认约束——不是语法限制,而是设计上不鼓励冗余时间戳列;如果硬要多列,默认值必须显式用 GETDATE() 或 SYSDATETIME(),否则解析失败。

















