关于sql:数据类型“带时区的时间戳”中的时区存储

Time zone storage in data type “timestamp with time zone”

在PostgreSQL中,数据类型timestamptimestamp with timezone都使用8个字节。

我的问题是:

  • 用于存储日期和格式的格式 时间戳中的时间?
  • 时区信息如何存储在timestamp with timezone
    类型,以及在阅读类型后如何解析?

  • 这只是一种误解,源于有点误导性的类型名称。时区本身根本不存储。它只是作为偏移来计算实际存储的UTC时间戳。这完全符合SQL标准。

    只是存储时间点,没有区域信息。这就是为什么64位信息就足够了。根据会话的当前时区设置向客户端显示时间戳。

    细节:

    • 在Rails和PostgreSQL中完全忽略时区

    此外,由于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。


    看文档:

    • 时间戳存储为整数或(已弃用)浮点数
    • 如果实际存储时区,我不相信timestamp with timezone可以在8字节内正确编码。只是时间戳需要64位,因为log 2 (298989 * 365 * 24 * 60 * 60 * 1000000)大于63.注意time with time zone需要12个字节,具有相同的精度但是一天的范围。

    请参阅Erwin的答案,解释它实际上如何以8个字节存储 - 它应该被称为"没有时区的时间戳,但存储在UTC中并转换为本地时区以供显示"。伊克。