当需要时,我在我的数据库中使用 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/

10-12 03:33