Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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 Postgres 9.6,时区:为什么这两个查询给了我不同的时间_Postgresql_Timezone_Utc - Fatal编程技术网

Postgresql Postgres 9.6,时区:为什么这两个查询给了我不同的时间

Postgresql Postgres 9.6,时区:为什么这两个查询给了我不同的时间,postgresql,timezone,utc,Postgresql,Timezone,Utc,好吧,所以我对时区一直很模糊。我正在好转,但还没有好转。你们这些人能启发我吗 上下文:我从前端接收UTC时间。例如,为了表示日期2019年9月1日,我将得到2019-08-31 22:00:00Z(我们在布鲁塞尔夏令时,因此相差2小时) 从那一天开始,我需要在那之前生成一个6个月的系列。这就是三月四月五月六月七月八月 我设法找到了解决办法,说实话,这有点运气。我仍然不确定我是否了解下面发生的事情的细节: database=> show timezone; TimeZone ------

好吧,所以我对时区一直很模糊。我正在好转,但还没有好转。你们这些人能启发我吗

上下文:我从前端接收UTC时间。例如,为了表示日期
2019年9月1日
,我将得到
2019-08-31 22:00:00Z
(我们在布鲁塞尔夏令时,因此相差2小时)

从那一天开始,我需要在那之前生成一个6个月的系列。这就是三月四月五月六月七月八月

我设法找到了解决办法,说实话,这有点运气。我仍然不确定我是否了解下面发生的事情的细节:

database=> show timezone;
 TimeZone 
----------
 UTC
(1 row)

database=> select generate_series(
        ('2019-08-31 22:00:00Z'::timestamp at time zone 'Europe/Brussels')::date - '6 month'::interval,
        ('2019-08-31 22:00:00Z'::timestamp at time zone 'Europe/Brussels')::date - '1 month'::interval,
        '1 month'::interval
      );
   generate_series   
---------------------
 2019-02-28 00:00:00
 2019-03-28 00:00:00
 2019-04-28 00:00:00
 2019-05-28 00:00:00
 2019-06-28 00:00:00
 2019-07-28 00:00:00
(6 rows)

database=> select generate_series(
        ('2019-08-31 22:00:00Z' at time zone 'Europe/Brussels')::date - '6 month'::interval,
        ('2019-08-31 22:00:00Z' at time zone 'Europe/Brussels')::date - '1 month'::interval,
        '1 month'::interval
      );
   generate_series   
---------------------
 2019-03-01 00:00:00
 2019-04-01 00:00:00
 2019-05-01 00:00:00
 2019-06-01 00:00:00
 2019-07-01 00:00:00
 2019-08-01 00:00:00

如果我使用
::timestamp

实际上有两种不同的&ldauo;操作符“在时区命名为
”,一个将带时区的
时间戳转换为不带时区的
时间戳,另一个转换为带时区的
时间戳

如果第一个参数是带时区的
时间戳
,则该值将转换为不带时区的
时间戳
,该值显示该时区的挂钟的功能

如果第一个参数是不带时区的
时间戳
,它将在会话时区中解释(由
时区
参数的值给出),并转换为绝对时间戳

现在,
带时区的时间戳
是日期/时间类型类别的首选类型,因此,第二个查询中的字符串文字将根据定义解释为带时区的时间戳。在第一个查询中,它是一个不带时区的时间戳。由于涉及不同的运营商,因此结果不同也就不足为奇了

在您的第一个查询中,墙上的时钟时间22:00被解释为时钟挂在布鲁塞尔,因此实际上是UTC 20:00。
generate_series
的第一个参数是2019年2月28日20:00 UTC(在转换到
日期之前),从该参数开始计数