我正在尝试处理输入数据,在保存时加上时间戳
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。
答案 0 :(得分:0)
您需要了解timestamp
(timestamp without time zone
)和timestamptz
(timestamp 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})得到不同的结果设置你的会话)。
详细说明: