如何确定给定时区中的给定时间是不是在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。我想通过SQLSQLCREATE FUNCTION 语句创建的函数来确定给定时间是否在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,那么结果应该是假的。

如何使用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?的主要内容,如果未能解决你的问题,请参考以下文章

确定 DST 是不是对给定 time_t 的指定时区有效

如何在 Flatpickr 中将给定时区设置为默认时区而不是系统时区?

给定 UTC 时间戳和 UTC 偏移量,是不是可以在 Python 中获取时区?

给定时间内的 Postgres SUM

如何确定一个实体是不是适合 O(N^2) 中的给定框?

如何确定删除给定循环是不是会断开图表