我试图获取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">
我只需要从中提取7881和44100值。如何从这个区间中提取这些值?
您正在使用哪个版本的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值类似。