Informix SQL-两个日期之间的天数



我试图获取2个日期时间之间的天数(时间为00:00:00的时间戳值),并尝试了以下查询:

select
"Date1",
"Date2",
extend("Date1", year to fraction(5)) - extend("Date2", year to fraction(5)) as "TotalDaysDifference" 
from
"mytable"

此查询以以下方式返回值:

  • 如果Day1="2021-02-29 00:00:00"且Day2="2021:09-27 00:00:00",则TotalDaysDifference="7881 00:00:00.00000000">

  • 如果Day1="1900-12-31 00:00:00"且Day2="2021-09-27 00:00:00",则TotalDaysDifference="44100 00:00:000000">

我只需要从中提取788144100值。如何从这个区间中提取这些值?

您正在使用哪个版本的Informix?

下面是一个使用Informix 14.10.FC5:的示例

CREATE TABLE mytable
(
id    INTEGER,
date1 DATETIME YEAR TO SECOND,
date2 DATETIME YEAR TO SECOND
);
-- Using 2021-02-28 instead of 2021-02-29 because 2021-02-29 is an incorrect date and Informix returns an error.
INSERT INTO mytable VALUES ( 1, '2021-02-28 00:00:00', '2021-09-27 00:00:00' );
INSERT INTO mytable VALUES ( 2, '1900-12-31 00:00:00', '2021-09-27 00:00:00' );
SELECT
date1,
date2,
( date1 - date2 )::INTERVAL DAY(9) TO DAY AS daysdifference1, -- no need to transform the datetime with "extend". I just cast the result to an interval of days
( date2 - date1 )::INTERVAL DAY(9) TO DAY AS daysdifference2
FROM
mytable
WHERE
id = 1
;
date1               date2               daysdifference1 daysdifference2
2021-02-28 00:00:00 2021-09-27 00:00:00       -211             211
SELECT
date1,
date2,
( date1 - date2 )::INTERVAL DAY(9) TO DAY AS daysdifference1, -- no need to transform the datetime with "extend". I just cast the result to an interval of days
( date2 - date1 )::INTERVAL DAY(9) TO DAY AS daysdifference2
FROM
mytable
WHERE
id = 2
;
date1               date2               daysdifference1 daysdifference2
1900-12-31 00:00:00 2021-09-27 00:00:00     -44100           44100

如果您不关心两个日期/时间值中的时间,那么只需转换为date值并减去:

SELECT "Date1", "Date2",
"Date1"::DATE, "Date2"::DATE,
"Date2"::DATE - "Date1"::DATE
FROM "mytable"

必须在环境中设置DELIMIDENT的情况下运行,才能启用用双引号括起来的分隔标识符。

转换为DATE的优点是减法的结果是一个整数值,而不是一个区间,而且通常使用起来更简单。

你的第一个例子是:

如果第1天="2021-02-29 00:00:00",第2天="2021年9月27日00:00:00",则TotalDaysDifference="7881 00:00:000000"。

根据您的SQL,该值应为Date1。由于2021年不是闰年,您不应该插入值2021-02-29。此外,一年只有365天,所以不清楚为什么你预计同一年的两个日期之间会有7881天。

然而,如果我们将2021-02-29更改为2000-02-29(2000年是闰年!),那么减法的结果确实是7881。

概念证明

CREATE TEMP TABLE "mytable"
(
"Date1" DATETIME YEAR TO SECOND NOT NULL,
"Date2" DATETIME YEAR TO SECOND NOT NULL
);
INSERT INTO "mytable" VALUES('1900-12-31 00:00:00', '2021-09-27 00:00:00');
--INSERT INTO "mytable" VALUES('2021-02-29 00:00:00', '2021-09-27 00:00:00');
INSERT INTO "mytable" VALUES('2000-02-29 00:00:00', '2021-09-27 00:00:00');
SELECT "Date1", "Date2",
"Date1"::DATE AS "Date1 AS DATE",
"Date2"::DATE AS "Date1 AS DATE",
"Date2"::DATE - "Date1"::DATE AS "Difference in days"
FROM "mytable";

输出

我在环境中使用DBDATE=Y4MD-,所以DATE值的格式与DATETIME值类似。

日期1日期日期年份至秒日期日期1900-12-31 00:00:002021-09-27 00:00:001900-12-312021-09-2741002000-02-29 00:00:00

最新更新