【问题标题】: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命令的结果?或者有没有内部函数可以做到这一点?

查表总是很慢。正在寻找一种快速的方法。

【问题讨论】:

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


    【解决方案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 会更快

    【讨论】:

    • 感谢您的帮助。有没有更快的方法来解决问题?查表总是很慢。
    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 2016-08-11
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多