Informix - 将日期时间转换为整数

Informix - Convert datetime to integer

我在 UTC 中将值存储为 "datetime year to fraction (3)",我想将其偏移到我服务器上的时区。我正在尝试使用函数 DBINFO 'utc_to_datetime' 转换为本地时间,但第二个参数应该是一个整数,而我的值是日期时间。那么,如何将日期时间转换为整数?

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

产量(使用相同的服务器 运行ning 在 UTC):

2017-09-22 19:10:44

更改为您服务器上的时区

还有一些空间可以讨论确切的细节,但基本上您需要做的是将代表时区的 INTERVAL 添加或减去 DATETIME YEAR TO FRACTION(3) 值。

例如:

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

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

有一个有趣的问题是,UTC 以东的时区偏移量是正还是负:ISO 9945 表示正西,负东; ISO 8601(和 ISO 9075,SQL)表示正东,负西。选择遵循 ISO 8601,但要注意这个问题。

冬令时与夏令时——夏令时与标准时间

My problem with interval is that we are sometimes on CST and sometimes CDT, ie. -6 hours and -5 hours. The server automatically updates its time, so I'd like to use that to my benefit. Can I dynamically choose the interval somehow?

这很快就会变得非常棘手。在世界的某些地区,关于在冬令时和夏令时之间切换的规则(我将使用这个术语,虽然它不是特别标准,但是夏令时在世界范围内不是标准的,除非美国软件有使人们接受它)改变了大多数年份,有时是出于政治上的心血来潮,有时是因为观察阴历和斋月等事件之间的相互作用。 'Olson Time Zone Database' 由 IANA 在 https://www.iana.org/time-zones (aka https://www.iana.org/tz 托管;这将重定向到更长的名称)。今年,数据库当前版本还是2017b;然而,在过去的几年中,有诸如 2005r、2006n、2007k、2008h、2009r、2010n、2011i、2012i、2013i、2014g、2015g、2016j 之类的版本——它们不一定是那些年的最后一个版本,但它们是这些年来我拥有的最新版本。我相信今年将(至少)再发布一个版本,大约在 10 月底的某个时候。一个问题是时区规则的变化通常不会引起太多注意。

忽略在世界某些地区更改冬令时和夏令时之间切换的定义的问题,您有确定服务器使用的时区偏移量的问题。有一个 DBINFO('get_tz') 调用 returns 服务器的时区字符串;但是,它不会告诉您与 UTC 的偏移量。您可以检索该字符串并在本地应用它(在客户端中编码 运行ning),但这无疑是混乱的。

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

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

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

使用 GNU 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
$

这表明自 'The Epoch' 以来的秒数为 1,506,114,539,在 UTC(格林威治标准时间,或多或少)2017 年 9 月 22 日 t运行 变为 21:08:59区。它也是 US/Pacific 或 America/Los_Angeles 时区的 14:08:59,其缩写为 PDT(太平洋夏令时)。

确定 Informix 服务器中的差异(夏季或夏令时为 7 小时)很棘手。在处理其他时区偏移值中的时间时加倍如此,而在时钟 'fall back' 的早晨处理 01:00 和 02:00 之间的时间时模棱两可(有无法判断时间值是使用冬季时区偏移量还是夏季时区偏移量存储的。

我将需要对此进行冥想 — 并查看以前的答案等。