如何确定给定时区中的给定时间是不是在postgresql中是DST?
Posted
技术标签:
【中文标题】如何确定给定时区中的给定时间是不是在postgresql中是DST?【英文标题】:How to determine whether a given time in a given time zone is DST or not in postgresql?如何确定给定时区中的给定时间是否在postgresql中是DST? 【发布时间】:2018-03-02 11:52:54 【问题描述】:我正在使用 postgresql。我想通过SQL
或SQL
由CREATE FUNCTION
语句创建的函数来确定给定时间是否在DST 中。
例如。在Europe/Rome
时区,从2017-03-26 03:00:00
到2017-10-29 02:59:59
的当地时间为夏令时。
如果给定时间是2017-04-01 00:00:00
,那么结果应该为真。
如果给定时间是2017-11-01 00:00:00
,那么结果应该是假的。
如何使用SQL实现postgresql中的功能?
有没有存储过渡时间点的过渡表,比如linux中zdump -v Europe/Rome
命令的结果?或者有没有内部函数可以做到这一点?
查表总是很慢。正在寻找一种快速的方法。
【问题讨论】:
【参考方案1】:我假设是这样的:
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 会更快
【讨论】:
感谢您的帮助。有没有更快的方法来解决问题?查表总是很慢。以上是关于如何确定给定时区中的给定时间是不是在postgresql中是DST?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flatpickr 中将给定时区设置为默认时区而不是系统时区?