CURRENT_TIMESTAMP 的数据库无关 SQL

Posted

技术标签:

【中文标题】CURRENT_TIMESTAMP 的数据库无关 SQL【英文标题】:DB agnostic SQL for CURRENT_TIMESTAMP 【发布时间】:2013-12-30 17:42:34 【问题描述】:

我目前正在使用 Oracle,但大多数 SQL 与数据库无关。一个例外是在 MSSQL 中失败的 CURRENT_TIMESTAMP。是否也可以为此迁移到更便携的语法?

【问题讨论】:

now() 在 oracle 中不起作用。我认为你在这方面可能有点不走运。 是的。似乎 CURRENT_TIMESTAMP 不像***.com/questions/186572/… 建议的那样便携。 GETDATE() 虽然有效。感谢您的回复 CURRENT_TIMESTAMP 是 ANSI SQL,getdate() 不是并且会在 Oracle 上失败 【参考方案1】:

根据他们的文档,以下供应商支持CURRENT_TIMESTAMP

Oracle Postgresql mysql SQL Server Firebird H2 HSQLDB DB2 Vertica InterSystems Caché Doctrine Teradata

总之,CURRENT_TIMESTAMP 是 SQL 标准中规定的方法,其摘要如下,如果您正在寻找与 DB 无关的 SQL,那么您真正能做的最好的事情就是坚持标准,尽管这并不保证任何东西都完全与数据库无关:

6.32

功能

指定一个产生日期时间类型值的函数。

格式

<current date value function> ::= CURRENT_DATE`
<current time value function> ::= CURRENT_TIME [ <left paren> <time precision> <right paren> ]
<current local time value function> ::= LOCALTIME [ <left paren> <time precision> <right paren> ]
<current timestamp value function> ::= CURRENT_TIMESTAMP [ <left paren> <timestamp precision> <right paren> ]
<current local timestamp value function> ::= LOCALTIMESTAMP [ <left paren> <timestamp precision> <right paren> ]

一般规则

1) s CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP 分别返回当前日期、当前时间、当前时间戳;返回时间和时间戳值,时区位移等于 SQLsession 的当前默认时区位移。

【讨论】:

@a_horse_with_no_name 谢谢,我已将它们添加到支持它的 DBMS 列表中,以及文档链接。 DB2 也支持current_timestamp:publib.boulder.ibm.com/infocenter/db2luw/v9r5/topic/… SQL Fiddle 链接似乎已损坏。 @MikePartridge 谢谢。自从这个答案以来,SQL Fiddle 已经升级了很多次,所以我刚刚删除了对 SQL Fiddle 的引用。【参考方案2】:

jOOQ user manual 以及 SQL translation website 可用于此类查找。来自手册:

-- Access
now()

-- Sybase ASE
current_bigdatetime()

-- MariaDB, MemSQL, MySQL, Snowflake
current_timestamp()

-- BigQuery, CockroachDB, CUBRID, Db2, Derby, EXASOL, Firebird, H2, HANA, HSQLDB,
-- Ignite, Ingres, Oracle, PostgreSQL, Redshift, SQLite, SQL Server, Teradata
-- Vertica
CURRENT_TIMESTAMP

-- Informix
CURRENT

-- Sybase SQL Anywhere
CURRENT TIMESTAMP

免责声明:我为 jOOQ 背后的公司工作。

【讨论】:

以上是关于CURRENT_TIMESTAMP 的数据库无关 SQL的主要内容,如果未能解决你的问题,请参考以下文章

关键字“current_timestamp”附近的语法不正确 - 但仅在一个数据库上

Liquibase:如何使用 CURRENT_TIMESTAMP 加载数据?

有没有办法让 CURRENT_TIMESTAMP 只在数据库中存储日期、小时和分钟?

如何在带有 JUnit 的 H2 数据库中使用“更新 CURRENT_TIMESTAMP”?

请问current_timestamp是啥数据库的语法?还是各数据库都是同用的?

MySql的CURRENT_TIMESTAMP