是否存在ANSI/ISO SQL标准语法可获取数据库当前时间?
标准SQL获取当前时间的实现说明
1. 带时区/UTC时间获取可行性
可以实现,ANSI SQL标准已经提供了对应语法:
- 要获取带时区信息的当前时间:直接使用标准定义的
CURRENT_TIMESTAMP即可,该函数返回类型为TIMESTAMP WITH TIME ZONE,自带当前会话的时区属性。 - 要直接获取UTC时间:可以使用标准语法
CURRENT_TIMESTAMP AT TIME ZONE 'UTC',即可将当前时间转换为UTC时区返回。
2. 跨DBMS通用写法说明
不存在100%不受具体DBMS限制的通用写法,差异来源于部分数据库的历史设计要求:
- ANSI SQL标准本身没有强制要求SELECT仅返回函数/常量的语句必须携带FROM子句,目前PostgreSQL、SQL Server、MySQL 8.0+、SQLite、BigQuery等绝大多数主流数据库都支持直接执行
SELECT CURRENT_TIMESTAMP;。 - 只有Oracle、达梦等Oracle兼容体系的数据库,以及非常老的MySQL版本要求必须加
FROM DUAL才能执行无表查询。
如果需要兼容多类数据库,最稳妥的方案是在数据访问层根据连接的数据库类型做语法适配,按需拼接FROM DUAL子句即可。
主流数据库实际使用示例
- 获取带时区的当前时间:
- Oracle/达梦:
SELECT CURRENT_TIMESTAMP FROM DUAL; - 其他主流数据库:
SELECT CURRENT_TIMESTAMP;
- Oracle/达梦:
- 获取UTC时间:
- 支持ANSI标准语法的数据库(PostgreSQL、MySQL 8.0+、SQL Server 2016+):
SELECT CURRENT_TIMESTAMP AT TIME ZONE 'UTC'; - Oracle:
SELECT SYS_EXTRACT_UTC(CURRENT_TIMESTAMP) FROM DUAL; - 低版本MySQL:
SELECT UTC_TIMESTAMP(); - 低版本SQL Server:
SELECT GETUTCDATE();
- 支持ANSI标准语法的数据库(PostgreSQL、MySQL 8.0+、SQL Server 2016+):
内容的提问来源于stack exchange,提问作者stmoebius
相关产品推荐
相关产品推荐

