MySQL中NOW()与CURRENT_TIMESTAMP完全等价;PostgreSQL必须用NOW();SQL Server用GETDATE()或SYSDATETIME();SQLite用datetime('now')且'now'需加单引号;跨数据库移植时函数不通用,需按引擎适配。

MySQL里用NOW()还是CURRENT_TIMESTAMP?
两者在MySQL中完全等价,都返回当前日期时间(精确到秒,部分版本支持微秒)。插入时直接当表达式用就行,不需要加引号:
INSERT INTO logs (message, created_at) VALUES ('test', NOW());如果字段类型是DATETIME或TIMESTAMP,用这两个函数都没问题。但注意:TIMESTAMP字段受时区影响,而DATETIME存的是字面值;如果表定义里该字段有DEFAULT CURRENT_TIMESTAMP,那显式插入NOW()会覆盖默认行为。
PostgreSQL必须用NOW(),别写SYSDATE
PostgreSQL不支持SYSDATE(那是Oracle的),也不推荐CURRENT_TIMESTAMP带括号写法(虽然语法允许,但易和函数混淆)。最稳妥的是:
INSERT INTO events (name, occurred_at) VALUES ('login', NOW());NOW()返回timestamptz(带时区),如果字段是TIMESTAMP WITHOUT TIME ZONE,PostgreSQL会自动截掉时区信息——但可能丢精度,建议字段类型统一用TIMESTAMP WITH TIME ZONE。
SQL Server用GETDATE(),不是NOW()
SQL Server没有NOW()函数,用GETDATE()(返回datetime,精度约3.3毫秒)或更精确的SYSDATETIME()(返回datetime2(7)):
INSERT INTO orders (item, placed_at) VALUES ('book', GETDATE());如果字段是datetime2,优先用SYSDATETIME(),避免隐式转换导致的精度损失。另外,GETDATE()不受会话SET TIMEZONE影响,它始终返回服务器本地时间。
SQLite里datetime('now')要加单引号包裹字符串
SQLite没有原生日期类型,靠函数处理文本。必须写成datetime('now'),注意'now'是字符串字面量,不能漏引号:
INSERT INTO notes (content, updated_at) VALUES ('fix bug', datetime('now'));如果需要带本地时区,用datetime('now', 'localtime');如果字段是TEXT类型存ISO格式(如'2024-05-20 14:30:00'),这个函数输出刚好匹配。但别用strftime()拼接——容易出格式错误,也难索引。
跨数据库移植时最容易踩的坑:以为NOW()通用,结果在SQL Server或SQLite里报错。实际写法取决于引擎,没银弹。字段类型和函数返回值的隐式转换也常引发时区偏移或精度丢失,尤其在混合使用TIMESTAMP和DATETIME时。

















