sql - 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
值,即没有存储时区信息,所以我理解需要指定时区start
,end
因为它们是 Postgres 需要计算的格式化字符串epoch
。
我不太明白的是:
MyDate::timestamp without time zone at time zone 'CET'
Postgres 知道epoch
forMyDate
因为它的值是存储的,为什么需要“转换”到时区?
我们在这里实际上在说什么,这可以简化吗?
解决方案
Postgres 从不将时区信息存储在timestamp
or中timestamptz
。在这种timestamptz
情况下,使用呈现的时间戳中的时区信息或设置的值将存储的时间戳旋转到一个UTC
值TimeZone
,然后存储。在timestamp
没有完成的情况下。在输出时 a会从任何设置或通过timestamptz
旋转回。在这种情况下,假定检索到的值是 的设置,除非您用 覆盖。最佳做法是您使用.UTC
TimeZone
at time zone <some_tz>
timestamp
TimeZone
at time zone <some_tz>
timestamptz
推荐阅读
- android - Qt for android 链接器警告
- docker - “无法连接到 Docker 守护进程”
- django - 重命名用户模型
- excel - Excel数据分组
- c# - 如何正确实现处理 POST 请求、检索 URI 参数和请求有效负载的 .NET 控制器方法?
- javascript - 使用 Material UI 从 JSON 构建动态表单
- java - 使用 Prodgaurd 混淆 Spring Boot 应用程序的步骤
- javascript - 使用 moment 将当前时间转换为毫秒
- matlab - MATLAB - 读取多个 *.log 文件,计算并在新文件夹中保存为 .*txt
- c# - 我如何设置 Searchbar Inative 和用户单击此以打开对话框