我想使用标准SQL获取数据库的当前时间。结果必须以UTC为单位或带有时区信息。这可能吗?如果是,如何?
显然,有CURRENT_TIMESTAMP,它是ANSI SQL,但有ANSI SQL语法可以检索吗?一些DBMS支持select CURRENT_TIMESTAMP
,另一些则需要select CURRENT_TIMESTAMP from DUAL
。有没有办法使这个DBMS独立?
ANSI/ISO SQL标准具有CURRENT_TIME
以获取带有时区信息的时间,以及LOCALTIME
以获取不带时差信息的时间。
然而,许多产品都有自己的功能。
简短回答:
没有标准的函数可以做到这一点(据我所知(。每个供应商都实现了自己的功能来处理日期和时间,包括检索当前时间
请参阅@jarlh对此的回答。
可能的解决方案(假设您可以控制数据库(:
您可以使用(或代理(特定于供应商的函数创建包含一条记录的视图,并将其用作应用程序中的源。
例如(SQL Server(
CREATE VIEW dbo.[DateTime] AS
SELECT
SYSUTCDATETIME() AS UTCDateTime
;
或在(MySQL(中
CREATE VIEW DateTime AS
SELECT
UTC_TIMESTAMP as UTCDateTime
;
假设您使用SQL server:
SELECT CONVERT(varchar(10), GETUTCDATE(), 108)
ANSI SQL执行此操作的方法是使用VALUES
语句。这与SELECT
语句类似,因为它返回一个结果集。但它没有引用任何表。这是执行类似Oracle的DUAL
伪表的功能的标准方法。
下面是一个使用MySQL 8.0的演示:
mysql> VALUES ROW(CURRENT_TIMESTAMP);
+---------------------+
| column_0 |
+---------------------+
| 2021-11-22 14:56:58 |
+---------------------+
参见:
- https://dev.mysql.com/doc/refman/8.0/en/values.html
- https://modern-sql.com/feature/values