【问题标题】:Cannot find a common SQL that will work both for H2 and Postgres找不到适用于 H2 和 Postgres 的通用 SQL
【发布时间】:2013-02-21 11:49:34
【问题描述】:

在我的项目中,我使用 Postgres 数据库,但有时,为了开发,我使用 H2。 我正在尝试定义一个 sql 脚本,该脚本将更新时间戳列,如下所述,但我找不到可以同时应用于 Postgres 和 H2 的单一格式。

基本上,sql 正在尝试将时间戳设置为NOW + 1 week

这是适用于 Postgres 的 sql:

update mytable set mytime = CURRENT_TIMESTAMP + INTERVAL '7 days';

这是适用于 H2 的 sql:

update mytable set mytime = CURRENT_TIMESTAMP + 7;

有人可以建议一个可以对两个数据库执行相同操作的 sql 吗?

【问题讨论】:

  • 一开始就不应该使用不同的 DBMS 进行开发。这是自找麻烦。
  • 显然,如果您需要部署到指定自己数据库的客户,那么您需要寻找新客户!
  • 在开发中运行 Postgres 的提示:Postgres 可以是相当重量级的安装,因此如果在 Mac 上,您也可以使用Postgres.app,或者在您安装的地方安装虚拟机,例如 VirualBox 或 Fusion 或 Parallels Postgres 在诸如 BSD/Linux/macOS 之类的操作系统之上,或者使用来自 Heroku 或 Amazon AWS 或 Azure 等供应商的 Postgres 即服务,或者运行一个虚拟机,例如在 Digital Ocean 上安装 Postgres他们提供的 FreeBSD 或 Linux 实例。

标签: sql postgresql timestamp h2


【解决方案1】:

根据我的测试,这适用于 H2 和 PostgreSQL:

update mytable set mytime = 
cast(cast(current_timestamp as date) + 7 as timestamp) + 
cast(current_timestamp as time);

我同意这有点奇怪,但这是我在当前版本的 H2 和 PostgreSQL 中找到的唯一方法。

【讨论】:

  • 这对于加/减天似乎没问题,你会怎么做几个小时?有可能吗?
  • 我也在为类似的情况而苦苦挣扎,但现在只有几分钟。有关如何处理时间的任何更新?
【解决方案2】:

我们遇到了类似的问题,我们将 PostgreSQL 用于我们的应用程序,但我们的单元测试使用 H2。我们最终只是将日期算术移动到应用程序代码中。因此,使用上面的示例,将 sql 更改为

update mytable set mytime = ?;

然后在应用程序代码中(使用 Java)我们算出时间:

Instant future1Week = Instant.now().plus(1, ChronoUnit.WEEKS);

并将该值绑定到 PreparedStatement 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2020-09-13
    • 2017-01-12
    • 1970-01-01
    • 2023-02-08
    相关资源
    最近更新 更多