当需要时,我在我的数据库中使用 timestamp(3) with time zone
作为表,这在我的情况下几乎是任何情况。
我需要在比以下查询更复杂的查询中选择表的所有列。
我的问题是如何使用 SQL at time zone '<TIMEZONE>'
获取所需时区的时间戳(带时区),用于选择表达式,如 q.*
其中之一是时间戳(带时区)列。
我可能有相同情况的子查询。
是否有表达式可以在查询范围内实现此目的?
SELECT
q.*, -- created_at timestamp (with time zone) is already in here
q.created_at AT TIME ZONE 'EET', --instead of this redundant column selection
u.name AS author,
u.reputation,
CASE WHEN count(t.*)=0 THEN '[]' ELSE json_agg(t.*) END as tags
FROM posts q
-- authors
JOIN users u
ON q.author_id = u.id
-- tags
left join post_has_tag p_h_t
on q.id = p_h_t.post_id
left join tags t
on p_h_t.tag_id = t.id
WHERE q.post_type = 'question'
group by q.id, u.id;
最佳答案
如果您的列是 timestamp
类型,那么使用 AT TIME ZONE
是将它们转换为特定时区的正确方法。
但是,不要使用 EET
。使用基于特定地点的时区 from this list ,例如 Europe/Bucharest
- 或任何适用于您的时区。
或者,如果您的列是 timestamp with time zone
类型,那么您可以设置 session 的时区,postgres 将为您进行转换:
SET TIME ZONE 'Europe/Bucharest'
您应该阅读 the docs 以了解这两种时间戳类型的区别。
关于SQL 'AT TIME ZONE' ,查询范围和使用 'SELECT' 所有列 (tablename.*) 表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39211953/