Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Informix-将datetime转换为整数_Sql_Type Conversion_Informix - Fatal编程技术网

Sql Informix-将datetime转换为整数

Sql Informix-将datetime转换为整数,sql,type-conversion,informix,Sql,Type Conversion,Informix,我将值存储为UTC中的“datetime year to fraction(3)”,我希望将其偏移到服务器上的时区。我试图使用函数DBINFO'utc_to_datetime'转换为本地时间,但是第二个参数应该是整数,我的值是datetime。那么,如何将datetime转换为整数呢?DBINFO('utc\u to\u datetime',…)不是正确的工具 使用: SELECT DBINFO('utc_to_datetime', 0) FROM sysmaster:sysdual 收益

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

DBINFO('utc\u to\u 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
产量(同一台服务器以UTC运行):

更改到服务器上的时区 确切的细节还有讨论的余地,但基本上您需要做的是将表示时区的间隔与DATETIME YEAR的分数(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
有多种方法可以表示时区偏移。什么是最好的可能取决于您当前可用的格式。如果有一个表,列中的值是一个从小时到分钟的间隔值,这可能是最简单的——它可能是为作业创建的临时表。您可以处理字符串,或两个整数(小时和分钟),或一个整数(小时)(不处理印度(UTC+5:30)、尼泊尔(UTC+5:45)或纽芬兰(UTC-4:30)的时区)

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

冬季与夏季-夏令时与标准时间 我的时间间隔问题是,我们有时在CST上,有时在CDT上,即-6小时和-5小时。服务器会自动更新其时间,因此我希望利用这一点为我带来好处。我可以以某种方式动态选择时间间隔吗

这变得非常棘手,非常迅速。在世界上的一些地区,关于在冬季和夏季之间切换的规则(我将使用这个术语,虽然它不是特别标准,但夏令时不是世界范围内的标准,除非美国软件强迫人们接受它)大多数年份都会发生变化,有时是出于政治上的突发奇想,有时是因为观测的农历和斋月等事件之间的相互作用。“奥尔森时区数据库”由IANA托管(又名;这重定向到较长的名称)今年,数据库的当前版本仍然是2017b;然而,在过去的几年中,有一些版本,如2005r、2006n、2007k、2008h、2009r、2010n、2011i、2012i、2013i、2014g、2015g、2016j,它们不一定是这些年中的最后一个版本,但它们是我在这些年中的最新版本。我相信会有be(至少)今年还有一次发布,大约在10月底。一个问题是,人们通常不会太注意时区规则的变化

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

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
$
这表明,自“大纪元”以来的秒数为1506114539,在UTC(格林尼治标准时间,或多或少)时区中,它转换为2017年9月22日的21:08:59。在美国/太平洋或美国/洛杉矶时区中,它的缩写为PDT(太平洋夏令时)

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


我需要仔细考虑一下这个问题,看看以前的答案,等等。

你能展示一下这个领域目前的样子吗……以及期望的输出吗?谢谢乔纳森。所以我的时间间隔问题是,我们有时在CST上,有时在CDT上,即-6小时和-5小时。服务器会自动更新它的时间,所以我想使用这对我有好处。我能以某种方式动态选择时间间隔吗?我已经部分回答了你的评论,但只是部分。我需要更多的时间来处理这个问题。(我在做这件事时做了笔记,以期在DBMS中进行将来的更改。目前还不确定何时会更改。)回答得真棒,乔纳森。这并不能解决我的问题,但我现在明白了为什么这不是那么简单。很高兴能读到你提出的其他任何东西。
$ /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
$