[英]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
这里有什么问题?
没有错。 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.