微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过客户端和DBeaver访问的PostgreSQL时区

如何解决通过客户端和DBeaver访问的PostgreSQL时区

我在postgresql数据库(引擎版本10.11)中有一个表,该表的列名为resettime,其数据类型为timestamptz。数据库认时区为“澳大利亚/悉尼”。

列resettime的认值为timezone('UTC':: text,Now())。

我运行以下命令在DBEaver中设置此列。

update mytable set resettime = timezone('UTC',Now()) + interval '1 hour' where id = 1;

当前UTC时间为11:47,相应的AEST时间为21:47

运行上面的语句后,我试图通过DBEaver中的以下语句来获取复位时间。

select resettime from mytable where id=1

从这句话中,我得到了2020-09-14 12:47:25

然后,我在DBEaver中运行以下命令。

update mytable set resettime = resettime + interval '1 hour' where resettime < timezone('UTC',Now());

运行此命令后,我检查id = 1的记录的重置时间,发现重置时间符合我的期望。是正常的。

但是,当我在scala应用程序中运行相同的更新语句时,它将重置时间更新为2020-09-14 13:47:25我有一种感觉,如果我通过我的scala应用程序访问了复位时间,它仍然被视为AEST时间。我不想将认时区设置更改为UTC。

如何确保我的Scala应用程序也具有与通过DBEaver访问相同的行为?在上面的示例中,我希望我的Scala应用程序不更改resettime来运行相同的更新语句。谢谢!

解决方法

问题是timezone('UTC',now())将当前时间戳转换为timestamp without time zone –结果是当前时间戳,就像在设置为UTC时间的时钟上一样。

然后,当您将结果分配给resettime的{​​{1}}时,它将转换回原来的值,但这一次是根据您当前对timestamp with time zone参数的设置(与UTC不同。

因此,首先您要询问UTC时钟现在的外观,然后在您的当前时区解释该结果。结果,您最终得到一个偏移值。

简单正确的解决方案是根本不在两种时间戳类型之间进行转换,而是坚持使用timezome

timestamp with time zone

这将满足您的要求。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。