HSQLDB 中的 Postgresql 时间戳和未来默认值

Posted

技术标签:

【中文标题】HSQLDB 中的 Postgresql 时间戳和未来默认值【英文标题】:Postgresql timestamp and future default values in HSQLDB 【发布时间】:2015-02-19 20:45:42 【问题描述】:

我正在使用一个旧的 postgres 数据库,它使用如下列定义:

timestamp without time zone default (CURRENT_TIMESTAMP 
AT TIME ZONE 'UTC')

timestamp without time zone default (CURRENT_TIMESTAMP 
AT TIME ZONE 'UTC' + 30 * interval '1 day')

很遗憾,这些无法更改。 后者的目标是默认值是未来 30 天。 我正在尝试在其上添加一个使用 hsqldb 的现代 junit 测试框架。

要使其与 hsqldb 保持一致,需要将第一个定义更改为:

timestamp without time zone default CURRENT_TIMESTAMP 
AT TIME ZONE INTERVAL '0:00' HOUR TO MINUTE

但是,尽我所能,我想不出一种方法来复制列添加 30 天

【问题讨论】:

使用与生产环境不同的 DBMS 进行测试并不是一个好主意。最近的一个可能出错的例子是:***.com/q/28553532/330315 我同意你的观点,但是,在这种情况下,情况决定了它 【参考方案1】:

您可以使用 TRIGGER 作为这种默认值:

CREATE TRIGGER t BEFORE INSERT ON the_table
REFERENCING NEW AS newrow FOR EACH ROW
BEGIN ATOMIC
   SET newrow.the_column = CURRENT_TIMESTAMP AT TIME ZONE INTERVAL '0:00' HOUR TO MINUTE + INTERVAL '30' DAY;
END

更新:PostgreSQL 兼容性已扩展为将来接受值。示例

timestamp without time zone default (CURRENT_TIMESTAMP AT TIME ZONE INTERVAL '0:00' HOUR TO MINUTE + INTERVAL 30 DAY))

【讨论】:

奇怪的是,HSQL 数据库管理器在 expires timestamp(0) with time zone default (CURRENT_TIMESTAMP AT TIME ZONE INTERVAL '0:00' HOUR TO MINUTE + INTERVAL 1 hour) not null 的左括号上出错了。 谢谢。由于一些代码更改,Postgres 样式默认在 2.3.3 版本中有效,但在更高版本中无效。将在下一个版本中再次支持。

以上是关于HSQLDB 中的 Postgresql 时间戳和未来默认值的主要内容,如果未能解决你的问题,请参考以下文章

使用postgresql格式化时间戳和数字的两个问题

HSQL 时间戳和布尔数据类型的大小?

通过 Windows ODBC PostgreSQL 驱动程序连接到 HSQLDB 2.5

hsqldb 中的间隔格式异常无效,但查询在 Postgres 中有效

如何告诉 HSQLDB 允许为 SERIAL 定义身份?

HSQLDB 和唯一约束