首页 > 解决方案 > Postgres:`timestamp without time zone at time zone`的含义

问题描述

我在理解如何使用时区语义处理 Postgres 时遇到了一些麻烦:考虑这个表

TABLE MyTable (
    MyDate                            TIMESTAMP                NOT NULL,
    // other columns
);

而这个查询

SELECT  *
FROM MyTable
WHERE // conditions
AND tstzrange(#{start} ::timestamp with time zone, #{end} ::timestamp with time zone] @> MyDate::timestamp without time zone at time zone 'CET'

我知道Postgres只存储epoch值,即没有存储时区信息,所以我理解需要指定时区startend因为它们是 Postgres 需要计算的格式化字符串epoch

我不太明白的是: MyDate::timestamp without time zone at time zone 'CET'

Postgres 知道epochforMyDate因为它的值是存储的,为什么需要“转换”到时区?
我们在这里实际上在说什么,这可以简化吗?

标签: sqlpostgresqltimezone

解决方案


Postgres 从不将时区信息存储在timestampor中timestamptz。在这种timestamptz情况下,使用呈现的时间戳中的时区信息或设置的值将存储的时间戳旋转到一个UTCTimeZone,然后存储。在timestamp没有完成的情况下。在输出时 a会从任何设置或通过timestamptz旋转回。在这种情况下,假定检索到的值是 的设置,除非您用 覆盖。最佳做法是您使用.UTCTimeZoneat time zone <some_tz>timestampTimeZoneat time zone <some_tz>timestamptz


推荐阅读