SELECT * FROM table_a
WHERE time_1 >= to_timestamp('11/01/2014 10:00 PDT', 'MM/DD/YYYY HH24:MI TZ')
time_1是UTC时区,它是带有时区的时间戳。那么,这会给我我想要的东西还是我需要在to_timestamp()函数中执行精确的UTC时间?
Postgresql有两种不同的时间戳数据类型,并且在何时使用哪一种令人困惑。这两种类型是:
timestamp
(也称为timestamp without time zone
),很可能是table_a中的类型timestamp with time zone
这是to_timestamp()返回的数据类型您必须确保将苹果与苹果或成对配对而不是将它们混合在一起,否则可能会得到不希望的结果。
如果您table_a.time_1
是a,timestamp with time zone
那么您在问题中提供的代码将可以正常工作。
如果您table_a.time_1
是a,timestamp
则需要更改代码:
SELECT *
FROM table_a
WHERE time_1 >= to_timestamp('11/01/2014 10:00 PDT', 'MM/DD/YYYY HH24:MI TZ') at time zone 'utc';
此(at time zone 'utc'
)的最后一部分将剥离指定的时间戳记中的时区(PDT),并将时间戳记转换为UTC。
编辑:以帮助您在此答案中的评论...
为了了解如何翻译时区,您需要了解两种形式的时间戳之间的区别。很清楚为什么您需要在下面理解这一点。正如我上面指出的那样,两种形式的时间戳之间的差异令人困惑。有一个很好的手册页,但现在继续阅读。
要了解的主要内容是,两个版本都没有实际存储时区(尽管有名称)。如果添加了额外的单词“ translation”,则命名会更有意义。考虑“没有时区转换的时间戳”和“有时区转换的时间戳”。
一个timestamp with time zone
翻译完全不存储时区。它旨在存储可能来自世界任何地方的时间戳记,并且对其含义不加赘述。因此,在输入一个时,您必须提供它来自的时区,否则postgresql将假定它来自您当前会话的时区。PostgreSQL自动将其从给定的时区转换为服务器的内部时区。您不需要知道哪个时区,因为在给您赋值之前,postgresql始终会将其从该内部时区转换回去。当您获取值(例如SELECT my_time FROM foo
:)时,PostgreSQL将时间戳转换为当前会话的时区。或者,您可以指定要转换成的时区(例如:)SELECT my_time AT TIME ZONE 'PDT' FROM foo
。
考虑到这一点,您将更容易理解,从指定的时间开始,timestamp
无时区转换将永远不会改变。即使您在美国表示11岁,在英国表示12岁,Postgresql也会被视为11:00:00
已经发生12:00:00
。很容易看出为什么这可能不是您想要的。
一个非常常见的编程错误是认为atimestamp with time zone
在特定时区。不是。无论您要在哪个时区。而且,如果您未指定所需的时区,则postgresql会假设您希望在当前会话时区使用。
你说,你的领域是timestamp with time zone
它们都在UTC
。从技术上讲这是不正确的。您的会话时区很可能是UTC,因此postgresql会为您提供UTC中的所有内容。
因此,您有一个timestamp with time zone
,您想知道PDT中的这些时间吗?容易:SELECT my_time AT TIME ZONE 'PDT' FROM foo
。
重要的是要了解AT TIME ZONE '...'
语法在timestamp
和之间切换timestamp with time zone
。
timestamp AT TIME ZONE 'PDT'
转换为,timestamp with time zone
并告诉postgresql转换为PDT时区。timestamp with time zone AT TIME ZONE 'PDT'
转换为一个有timestamp
说服力的postgresql,以将其解释为来自“ PDT”。这种对称性意味着AT TIME ZONE 'foo'
您只需反转即可AT TIME ZONE 'foo'
。换种方式SELECT anything AT TIME ZONE 'PDT' AT TIME ZONE 'PDT'
将始终anything
保持不变。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句