代码之家  ›  专栏  ›  技术社区  ›  esafresa

Informix-将datetime转换为整数

  •  1
  • esafresa  · 技术社区  · 7 年前

    我将值存储为UTC中的“datetime year to fraction(3)”,我希望将其偏移到服务器上的时区。我试图使用函数DBINFO“utc\u to\u datetime”转换为本地时间,但第二个参数应该是整数,我的值是datetime。那么,如何将datetime转换为整数呢?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Jonathan Leffler    7 年前

    DBINFO('utc_to_datetime', …) 不是正确的工具

    SELECT DBINFO('utc_to_datetime', 0)
      FROM sysmaster:sysdual
    

    产量:

    1970-01-01 00:00:00
    

    (至少,当服务器的时区通过 TZ=UTC0

    SELECT DBINFO('utc_to_datetime', 1506107444)
      FROM sysmaster:sysdual
    

    2017-09-22 19:10:44
    

    更改为服务器上的时区

    例如:

    DROP TABLE IF EXISTS datetime_values;
    
    CREATE TABLE datetime_values
    (
        original    DATETIME YEAR TO FRACTION(3) NOT NULL,
        modified    DATETIME YEAR TO FRACTION(3)
    );
    
    INSERT INTO datetime_values(original) VALUES('1970-01-01 00:00:00');
    INSERT INTO datetime_values(original) VALUES('2017-09-22 12:31:46');
    INSERT INTO datetime_values(original) VALUES('1066-10-21 14:20:04');
    INSERT INTO datetime_values(original) VALUES('9989-01-20 00:00:00');
    
    SELECT * FROM datetime_values;
    
    UPDATE datetime_values
       SET modified = original - INTERVAL(-5:30) HOUR TO MINUTE;
    
    SELECT * FROM datetime_values;
    

    1970-01-01 00:00:00.000
    2017-09-22 12:31:46.000
    1066-10-14 14:20:04.000
    9989-01-20 00:00:00.000
    1970-01-01 00:00:00.000 1970-01-01 05:30:00.000
    2017-09-22 12:31:46.000 2017-09-22 18:01:46.000
    1066-10-14 14:20:04.000 1066-10-14 19:50:04.000
    9989-01-20 00:00:00.000 9989-01-20 05:30:00.000
    

    有多种方法可以表示时区偏移。什么是最好的可能取决于您当前可用的格式。如果有一个表,其中列中的值是小时到分钟的间隔值,那么可能最简单的方法是为作业创建一个临时表。您可以处理字符串,或两个整数(小时和分钟),或一个整数(小时)(不处理印度(UTC+5:30)、尼泊尔(UTC+5:45)或纽芬兰(UTC-4:30)的时区)。

    这变得非常棘手,非常迅速。在世界上的一些地区,关于在冬季和夏季之间切换的规则(我将使用该术语,虽然它不是特别标准,但夏时制在世界范围内不是标准的,除非美国软件迫使人们接受它)在大多数年里都会发生变化,有时是出于政治上的一时冲动,有时是因为观测农历和斋月等事件之间的相互作用。“奥尔森时区数据库”由IANA托管,位于 https://www.iana.org/time-zones (又名 https://www.iana.org/tz

    忽略在世界上某些地区更改冬季和夏季之间切换的定义的问题,您会遇到确定服务器使用的时区偏移的问题。有一个 DBINFO('get_tz')

    SELECT DBINFO('utc_current'), DBINFO('get_tz'),
           CURRENT YEAR TO SECOND
      FROM sysmaster:sysdual
    

    有一次,我运行了该查询并得到:

    1506114539   UTC0   2017-09-22 21:08:59
    

    date ,我可以分析:

    $ /opt/gnu/bin/date -u -d @1506114539
    Fri Sep 22 21:08:59 UTC 2017
    $ /opt/gnu/bin/date    -d @1506114539
    Fri Sep 22 14:08:59 PDT 2017
    $
    

    这表明,自“新纪元”以来的秒数为1506114539,在UTC(GMT,或多或少)时区内,转换为2017年9月22日的21:08:59。美国/太平洋或美国/洛杉矶时区也是14:08:59,缩写为PDT(太平洋夏令时)。

    确定Informix服务器中的差异(夏季或夏令时为7小时)很棘手。当处理其他时区偏移值中的时间时,情况更是如此,当处理凌晨01:00到02:00之间时钟“回落”的时间时,情况更是如此(无法判断时间值是使用冬季时区偏移还是使用夏季时区偏移存储的)。