繁体   English   中英

如何在 postgresql 中使用时区更新日期?

[英]How to update a date with a time zone in postgresql?

我想用时区(+2 小时)更新日期,但它最终为 UTC(0 小时)

日期类型是 'timestamp-with-timezone'

询问...

update table set date = '2022-05-25 13:28+02:00'

将在数据库中结束。

2022-05-25 11:28:00+00

这里有什么问题?

tl;博士

没有错。 Postgres 以 UTC 存储TIMESTAMP WITH TIME ZONE的值,始终与 UTC 的偏移量为零。 任何提交的偏移量或区域都用于调整到 UTC。

细节

日期类型是 'timestamp-with-timezone'

标准 SQL 和 Postgres 中都没有这种类型。

我假设您的意思是TIMESTAMP WITH TIME ZONE

它以 UTC 结尾(0 小时)

阅读精美的手册。 您正在看到记录在案的行为。

Postgres 总是将值存储在 UTC 中的TIMESTAMP WITH TIME ZONE类型的列中,也就是说,偏移量为零小时-分钟-秒。

输入提供的任何时区或偏移量都用于调整为 UTC。 然后丢弃提供的区域或偏移量。

所以TIMESTAMP WITH TIME ZONE类型的名称是用词不当。 首先,SQL 的作者考虑的是偏移量,而不是实时时区。 其次,存储任何提交的时区。 提交的区域用于调整然后丢弃。

如果您需要跟踪原始偏移量或区域,请添加额外的列。 您必须添加代码来存储偏移量或时区名称。

update table set date = '2022-05-25 13:28+02:00'将在数据库中结束。 2022-05-25 11:28:00+00这里怎么了?

没有什么是错的。 这是一个特性,而不是一个错误。 这两个字符串都代表相同的同时时刻。


仅供参考,数据库引擎在处理日期时间类型和行为的行为方面差异很大

有些人像 Postgres 对TIMESTAMP WITH TIME ZONE所做的那样,调整为 UTC,然后丢弃任何提供的时区或偏移量。 其他一些可能不会。

SQL 标准几乎没有涉及日期时间处理的主题。 它声明了几种类型,并且在所有情况下都覆盖不完整的情况下做得很差。 该标准忽略了定义行为。

因此,在数据库工作中处理日期时间时要非常小心。 仔细阅读特定数据库引擎的文档。 不要做假设。 运行实验以验证您的理解。 并且知道为日期时间编写可移植的 SQL 代码可能不可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM