Postgres时间戳,带有时区保存时间

时间:2016-07-01 21:59:43

标签: postgresql timezone timestamp-with-timezone

我正在尝试处理输入数据,在保存时加上时间戳

   tsSrc timestamp with time zone;
   ...
   tsSrc := strTelegram.rte_data[ iPos ];-- this input data datetime 
   -- string e.g.'2015/12/13 21:35:26.000'
   ...
   insert into telegram(
      tld_id,
      ddt_num, tld_src_timestamp, 
      tld_dst_timestamp, tld_year, tld_month, 
      tld_day, tld_hour, tld_min, 
      tld_sec, tld_data 
   ) values(
      uuId,
      strTelegram.rte_type,
      tsSrc,
      strTelegram.rte_dst_timestamp,
      extract(year from tsSrc), extract(month from tsSrc), 
      extract(day from tsSrc), extract(hour from tsSrc), 
      extract(minute from tsSrc), extract(second from tsSrc), 
      strTelegram.rte_data 
  );

但是我得到了意想不到的结果,tsSrc保存为2015-12-13 20:35:26 + 03即小时-1班,同时extract(hour from tsSrc)返回正确的值并保存as 21.我做错了什么?

在postgresql.conf中将时区设置为“MSK-3”,select now()返回正确的日期时间,postgresql 9.3。

1 个答案:

答案 0 :(得分:0)

您需要了解timestamptimestamp without time zone)和timestamptztimestamp with time zone)的处理方式以及每种方式与当前会话的timezone设置的交互方式

解释"差异"您发现我们需要知道确切的表定义和保存行的会话的timezone设置,以及显示该行的会话的timezone设置。

例如,如果您使用timestamp文字'2015-12-13 21:35:26'(使用ISO格式以避免输入格式的额外复杂性!)并将其保存到会话中的timestamptz列时区偏移+2,然后在时区偏移+3的会话中选择相同的行,然后得到您所看到的内容:

SELECT '2015-12-13 21:35:26'::timestamp  AT TIME ZONE '+2' AT TIME ZONE '+3';

结果:

'2015-12-13 20:35:26'

换句话说:timestamptz'2015-12-13 20:35:26+03''2015-12-13 21:35:26+02'完全相同(同一时间点),只有显示符符合您的时区设置。当您根据世界角落墙上的时钟处理timestamptz值时(就像使用extract(hour from tsSrc)一样),根据您当前的位置({{1})得到不同的结果设置你的会话)。

详细说明: