Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PostgreSQL中,我们可以直接比较两个不同时区的时间戳吗?_Sql_Postgresql_Timezone_Timestamp - Fatal编程技术网

在PostgreSQL中,我们可以直接比较两个不同时区的时间戳吗?

在PostgreSQL中,我们可以直接比较两个不同时区的时间戳吗?,sql,postgresql,timezone,timestamp,Sql,Postgresql,Timezone,Timestamp,time_1是UTC时区,是带有时区的时间戳。因此,这将给出我想要的或我需要在函数to_timestamp()中执行的精确UTC时间吗?Postgresql有两种不同的时间戳数据类型,在使用时会混淆应该使用哪一种。这两种类型是: 时间戳(也称为无时区时间戳)这很可能是表a中的类型 带时区的时间戳这是 你必须确保你正在比较苹果与苹果或成对的苹果,不要把它们混在一起,否则你可能会得到不想要的结果 如果您的表a.time\u 1是带时区的时间戳,则您在问题中给出的代码可以正常工作 如果表a.tim

time_1是UTC时区,是带有时区的时间戳。因此,这将给出我想要的或我需要在函数to_timestamp()中执行的精确UTC时间吗?

Postgresql有两种不同的时间戳数据类型,在使用时会混淆应该使用哪一种。这两种类型是:

  • 时间戳
    (也称为
    无时区时间戳
    )这很可能是表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';