Time zone storage in data type “timestamp with time zone”
在PostgreSQL中,数据类型timestamp和timestamp with timezone都使用8个字节。
我的问题是:
用于存储日期和格式的格式 时间戳中的时间?
时区信息如何存储在timestamp with timezone中
类型,以及在阅读类型后如何解析?
这只是一种误解,源于有点误导性的类型名称。时区本身根本不存储。它只是作为偏移来计算实际存储的UTC时间戳。这完全符合SQL标准。
只是存储时间点,没有区域信息。这就是为什么64位信息就足够了。根据会话的当前时区设置向客户端显示时间戳。
细节:
此外,由于Jon提到它,time with time zone在SQL标准中定义,因此在Postgres中实现,但不建议使用它:
time with time zone is defined by the SQL standard, but the definition
exhibits properties which lead to questionable usefulness.
这是一种固有的模糊类型,无法正确处理DST。
-
哎呀,那可怕的误导。谢谢你纠正我的误解。
-
@ErwinBrandstetter新问题在这里:stackoverflow.com/questions/28877366/…
看文档:
-
时间戳存储为整数或(已弃用)浮点数
-
如果实际存储时区,我不相信timestamp with timezone可以在8字节内正确编码。只是时间戳需要64位,因为log 2 sub>(298989 * 365 * 24 * 60 * 60 * 1000000)大于63.注意time with time zone需要12个字节,具有相同的精度但是一天的范围。
请参阅Erwin的答案,解释它实际上如何以8个字节存储 - 它应该被称为"没有时区的时间戳,但存储在UTC中并转换为本地时区以供显示"。伊克。
-
嗨,pg 9.3 doc chp 8.5有一个表,它显示timestamp with timezone只使用8字节,因为它的范围从4713 BC到294276 AD,因此它不需要8个字节来存储日期和时间。时间,因此有时区信息的剩余位,但仍然想知道如何存储时区&解析。
-
@Eric:我知道它声称它只需要8个字节,但你怎么能指望它在不到8个字节的时间内覆盖微秒级精度,忽略时区?这就是我的答案中的计算点 - 显示该范围/精度组合需要8个字节。
-
我认为诀窍是在值的范围内,有限的范围减少了存储值所需的位,同时仍然保持精度,这是一种数学问题我猜,因为你可以看到time with timezone需要12个字节,因为它的范围更广。但这不是我关注的问题:)我希望了解时区商店&解析部分。
-
@EricWang:你的意思是什么"限制范围"? 4713BC至294276AD是298989年。这可能是一个比time更宽的范围,这是一天内的时间,但达到相同的精度?在我的世界中,298989年的范围比1天更广:)如果你能解释为什么你需要知道精确的存储格式,它也会有所帮助。这只是好奇心吗?您永远不需要自己处理原始存储格式。
-
我对time类型的预览理解不正确,将其与timezone进行比较是不正确的。阅读pg doc& timestamp.c源代码在问题的注释中提供,在c中,timezone是char或int值,稍后它将被压缩为更少的位(足以存储0~23),无论如何感谢您的帮助。
-
@EricWang:不确定你的意思是0~23--世界上有超过24个时区,甚至超过24个UTC偏移。如果你的意思是24位,这是合理的 - 但无论哪种方式,都没有1位备用来使timestamp with time zone以64位(8字节)的指定范围和精度实际存储 - 所以看起来文档存在缺陷。
-
0~23是我的想象,对不起:)。它是c中的char类型,因此可能达到256个时区。我问这个问题是因为pg有一个没有时区的时间戳的默认时区,我想更好地了解时区,以确保我编写了将在多个时区中使用的正确程序。
-
这里房间里的大象是:时区根本没有存储。