如何判断postgresql中给定时区内的给定时间是否为DST?

时间:2017-09-21 08:06:49

标签: sql postgresql plpgsql dst timestamp-with-timezone

我正在使用postgresql。我想通过SQL语句创建的SQLCREATE FUNCTION函数来判断postgresql中的给定时间是否为DST。

例如。在时区Europe/Rome,从2017-03-26 03:00:002017-10-29 02:59:59的当地时间在夏令时。

  • 如果给定时间为2017-04-01 00:00:00,则结果应为真。

  • 如果给定时间为2017-11-01 00:00:00,则结果应为false。

如何使用SQL实现postgresql中的功能? 是否存在存储转换时间点的转换表,例如linux中zdump -v Europe/Rome命令的结果?或者是否有任何内部功能可以做到这一点?

查找表总是很慢。寻找快速的方式。

1 个答案:

答案 0 :(得分:1)

我认为喜欢smth:

t=# create or replace function dst(t timestamp, tz text) returns boolean as
$$
declare
begin
  return (select t at time zone 'UTC' - t at time zone tz = utc_offset from pg_timezone_names where name = tz);
end;
$$ language plpgsql;
CREATE FUNCTION
t=# select dst('2017-04-01 00:00:00','Europe/Rome');
 dst
-----
 t
(1 row)

t=# select dst('2017-11-01 00:00:00','Europe/Rome');
 dst
-----
 f
(1 row)

我将plpgsql而不是sql留给了其他逻辑,例如,检查pg_timezone_names.is_std左右。如果不需要 - 更改为SQL会更快