I use 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
。使用基于特定地点的时区从这个列表中 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones, 例如Europe/Bucharest
- 或任何适用于您的内容。
或者,如果您的列属于类型timestamp with time zone
,然后您可以设置会话的时区,postgres 将为您进行转换:
SET TIME ZONE 'Europe/Bucharest'
你应该阅读the docs https://www.postgresql.org/docs/current/static/datatype-datetime.html了解这两种时间戳类型的区别。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)