在PostgreSQL中,我们可以直接比较两个不同时区的时间戳吗?
time_1是UTC时区,是带有时区的时间戳。因此,这将给出我想要的或我需要在函数to_timestamp()中执行的精确UTC时间吗?Postgresql有两种不同的时间戳数据类型,在使用时会混淆应该使用哪一种。这两种类型是:在PostgreSQL中,我们可以直接比较两个不同时区的时间戳吗?,sql,postgresql,timezone,timestamp,Sql,Postgresql,Timezone,Timestamp,time_1是UTC时区,是带有时区的时间戳。因此,这将给出我想要的或我需要在函数to_timestamp()中执行的精确UTC时间吗?Postgresql有两种不同的时间戳数据类型,在使用时会混淆应该使用哪一种。这两种类型是: 时间戳(也称为无时区时间戳)这很可能是表a中的类型 带时区的时间戳这是 你必须确保你正在比较苹果与苹果或成对的苹果,不要把它们混在一起,否则你可能会得到不想要的结果 如果您的表a.time\u 1是带时区的时间戳,则您在问题中给出的代码可以正常工作 如果表a.tim
(也称为时间戳
)这很可能是表a中的类型无时区时间戳
这是带时区的时间戳
表a.time\u 1
是带时区的时间戳
,则您在问题中给出的代码可以正常工作
如果表a.time\u 1
是时间戳
,则需要更改代码:
SELECT * FROM table_a
WHERE time_1 >= to_timestamp('11/01/2014 10:00 PDT', 'MM/DD/YYYY HH24:MI TZ')
最后一部分(在时区“utc”
)将去除指定时间戳的时区(PDT),并将时间戳转换为utc
编辑:帮助您在回答中发表评论… 为了理解如何翻译时区,您需要理解两种形式的时间戳之间的差异。下面将清楚地说明为什么您需要理解这一点。正如我在上面指出的,这两种形式的时间戳之间的差异令人困惑。有一个问题,但现在请继续读下去 要理解的主要问题是,两个版本实际上都没有存储时区(尽管名称不同)。如果您添加一个额外的单词“translation”,那么命名将更有意义。想想“没有时区转换的时间戳”和“有时区转换的时间戳” 带有时区的
时间戳
翻译根本不存储时区。它的设计目的是存储时间戳,这些时间戳可以来自世界任何地方,并且不会忘记它们的含义。因此,当输入一个时,必须提供它来自的时区,否则postgresql将假定它来自。Postgresql自动将其从给定时区转换为服务器的内部时区。您不需要知道那是什么时区,因为postgresql总是在给您值之前将它从这个内部时区转换回来。当您检索该值时(例如:从foo选择my_time
),postgresql将时间戳转换为当前会话的时区。或者,您可以指定要转换为的时区(例如:从foo中选择my_时区“PDT”)
考虑到这一点,更容易理解的是,没有时区转换的时间戳
从您指定的时间起永远不会更改。Postgresql将把11:00:00
视为发生在12:00:00
之前,即使你的意思是11在美国,12在英国。很容易理解为什么这可能不是你想要的
一个非常常见的编程错误是认为带时区的时间戳位于特定时区。事实并非如此。它在你要求的任何时区。如果您没有指定您希望它位于哪个时区,那么postgresql将假定您希望它位于当前会话时区
您已经声明,您的字段是带有时区的时间戳,这些时区都位于UTC
。这在技术上是不正确的。您的会话时区很可能是UTC,因此postgresql将以UTC为您提供一切
所以你有一个带有时区的时间戳,你想知道这些时间在PDT中是什么?简单:从foo中选择时区“PDT”的我的时间
重要的是要理解,在时区“…”
语法在时间戳
和带时区的时间戳
之间切换
时区“PDT”的时间戳
转换为带有时区的时间戳
,并告诉postgresql转换为PDT时区
时区为“PDT”的时间戳
转换为时间戳
告诉postgresql将其解释为来自“PDT”
此符号表示要在时区“foo”处反转
,只需在时区“foo”处使用
。换言之,在时区“PDT”中选择任何内容在时区“PDT”中
将始终保持任何内容
不变。谢谢您的回答。在我的例子中,time_1是一个带有时区的时间戳。在这种情况下,您的代码将只起作用:-)不要添加我为使用无时区的timestamp而提供的额外代码,顺便问一句,类似于从表中选择COUNT(*)按日期分组(时区“PDT”的time_1)
如果我想按天计数,那就工作吧?只有当你的时间戳都对齐的时候,这才行。。。1毫秒或1小时的差异将创建一个不同的组。您可以通过将时区格式设置为一个日期(to_char()
)进行分组,也可以通过在分组的不同字段中提取年、月、日。谷歌应该给你extract
的语法。对于特定的时间,它可能根据不同的时区属于不同的日期。我只是想知道如何在我执行日期(to_char())
之前将时间从UTC转换为PDT有一个很好的手册页面可以帮助您:
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';