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

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

【问题讨论】:

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

标签: sql database-agnostic


【解决方案1】:

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

总之,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 列表中,以及文档链接。
  • 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 背后的公司工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多