Sql “数据类型”中的时区存储;带时区的时间戳“;

Sql “数据类型”中的时区存储;带时区的时间戳“;,sql,postgresql,datetime,types,timezone,Sql,Postgresql,Datetime,Types,Timezone,在PostgreSQL中,数据类型timestamp和timestamp with timezone都使用8字节 我的问题是: 在时间戳中使用什么格式存储日期和时间 时区信息如何存储在带有时区的时间戳中 类型,以及在以后读取该类型时如何解析它 查看以下内容: 时间戳存储为整数或(不推荐使用的)浮点数 我认为,如果带有时区的时间戳实际存储了一个时区,那么它就不能在8字节内正确编码。仅时间戳需要64位,因为log2(298989*365*24*60*60*1000000)大于63。请注意,带时区的

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

我的问题是:

  • 在时间戳中使用什么格式存储日期和时间
  • 时区信息如何存储在带有时区的
    时间戳中
    类型,以及在以后读取该类型时如何解析它
  • 查看以下内容:

    • 时间戳存储为整数或(不推荐使用的)浮点数
    • 我认为,如果带有时区的
      时间戳实际存储了一个时区,那么它就不能在8字节内正确编码。仅时间戳需要64位,因为log2(298989*365*24*60*60*1000000)大于63。请注意,带时区的时间需要12个字节,精度相同,但范围为一天

    请参见Erwin的回答,以解释它实际上是如何以8字节的形式存储的——它应该被称为“没有时区的时间戳,但以UTC的形式存储并转换为本地时区以供显示”。Ick.

    这只是一个误解,源于有点误导性的类型名称。时区本身根本不存储。它只是作为偏移量来计算实际存储的UTC时间戳(输入)。或作为装饰器根据或时区(输出)显示时间戳。这都是根据SQL标准的

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

    详情:

    此外,正如Jon所提到的,
    时区时间在SQL标准中定义,因此在Postgres中实现:

    带时区的时间
    由SQL标准定义,但是 表现出导致有用性受到质疑的特性


    这是一种固有的模糊类型,无法正确处理。

    嗨,第9.3页doc chp 8.5有一个表,它显示带有时区的
    时间戳
    仅使用8字节,因为它的范围从
    4713 BC
    294276 AD
    ,所以它不需要8字节来存储日期和时间,因此时区信息有剩余位,但是仍然想知道时区是如何存储和解析的。@埃里克:我知道它声称它只需要8个字节,但是你怎么能期望它在不到8个字节的时间内覆盖从几年到微秒的精度,而忽略时区?这就是我的答案中计算的重点-显示范围/精度组合需要8个字节。我认为关键在于值的范围,有限的范围减少了存储值所需的位,同时保持精度,我想这是一个数学问题,正如您所看到的,时区时间需要12个字节,因为它的范围更广。但这不是我关心的:)我希望理解时区存储和解析部分。@EricWang:“有限范围”是什么意思?公元前4713年到公元294276年是298989年。这怎么可能比
    时间
    的范围更广呢?时间是一天内的时间,但精度相同?在我的世界里,298989年是比一天更宽的范围:)如果你能解释一下为什么你需要知道精确的存储格式,这也会有所帮助。这只是好奇吗?你永远不需要自己处理原始存储格式。这里的大象是:时区根本没有存储。哎呀,这是可怕的误导。谢谢你纠正我的误解。@ErwinBrandstetter新问题在这里: