MySQL中NOW()与CURRENT_TIMESTAMP完全等价,均返回本地DATETIME类型时间且事务内稳定;PostgreSQL中二者同义但仅CURRENT_TIMESTAMP可作列默认值;SQL Server必须用GETDATE(),其返回DATETIME类型且事务中多次调用结果相同。

NOW() 和 GETDATE() 都能查当前时间,但不能混用——前者是 MySQL/PostgreSQL 的,后者是 SQL Server 的,跨数据库直接报错。
MySQL 里该用 NOW() 还是 CURRENT_TIMESTAMP?
两者在 MySQL 中行为一致,都返回带时分秒的本地时间(DATETIME 类型),且默认自动更新(如果字段定义为 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)。但注意:
-
NOW()是函数别名,语义更直白,日常查询推荐用它 -
CURRENT_TIMESTAMP更符合 SQL 标准,适合需要跨数据库兼容的建表语句 - 别用
SYS_DATE()或TODAY()—— MySQL 不认,会报FUNCTION SYS_DATE does not exist
示例:
SELECT NOW(), CURRENT_TIMESTAMP;
SQL Server 必须用 GETDATE(),但要注意时区和精度
GETDATE() 返回 DATETIME 类型(精度到 3.33 毫秒,范围 1753–9999),不带时区信息。常见陷阱:
- 服务器系统时区决定结果,不是客户端时区;改时区要重启 SQL Server 实例才生效
- 如果需要更高精度或带时区,得换
SYSDATETIME()(精度 100 纳秒)或SYSDATETIMEOFFSET() -
GETDATE()在事务中多次调用返回相同值(语句级快照),而GETUTCDATE()是 UTC 时间,不是本地时间
示例:
SELECT GETDATE(), SYSDATETIMEOFFSET();
PostgreSQL 怎么选?NOW()、CURRENT_TIMESTAMP 还是 clock_timestamp()?
三者都常用,但语义不同:
-
NOW()和CURRENT_TIMESTAMP完全等价,返回事务开始时的时间戳(事务内不变) -
clock_timestamp()返回实际执行时刻,每调用一次都可能不同(比如在循环或触发器里) - 如果做性能打点或日志记录,必须用
clock_timestamp(),否则会误判耗时
示例:
SELECT NOW(), clock_timestamp();
跨数据库写法最稳妥的是避免硬编码函数——用 ORM 的 now() 方法或参数化占位符;真要写原生 SQL,先确认目标数据库类型再选函数,别凭印象写 GETDATE() 去连 MySQL。

















