我正在使用 Informix 数据库。我想得到两个日期之间的差异,返回值的数据类型必须是整数。SQL 看起来像:
select (today - to_date('20121201','%Y%m%d')) from your_table_name
但是,当我执行 SQL 时,它返回 45,当然计算的值不是整数类型。值的日期类型是什么?如何将值转换为整数?
TO_DATE 函数是一个 Oracle 导入,并在 Oracle 中返回一个 Oracle DATE 类型(因此得名),但 Oracle DATE 类型对应于一个 Informix DATETIME 类型。因此,TO_DATE() 函数的 Informix 实现返回一个 DATETIME 类型。
SELECT TODAY AS TODAY,
TO_DATE('20121201', '%Y%m%d') AS raw_to_date,
(TODAY - TO_DATE('20121201','%Y%m%d')) AS raw_difference
FROM sysmaster:informix.sysdual;
today raw_to_date raw_difference
DATE DATETIME YEAR TO FRACTION(5) INTERVAL DAY(8) TO DAY
2013-01-16 2012-12-01 00:00:00.00000 46
表达式的解决方案是将 DATE 函数应用于 TO_DATE 的输出,或将其转换为类型 DATE。
SELECT DATE(TO_DATE('20121201', '%Y%m%d')) AS date_to_date,
CAST(TO_DATE('20121201', '%Y%m%d') AS DATE) AS cast_to_date,
TO_DATE('20121201', '%Y%m%d')::DATE AS colon_to_date,
(TODAY - DATE(TO_DATE('20121201','%Y%m%d'))) AS date_difference
FROM sysmaster:informix.sysdual;
date_to_date cast_to_date colon_to_date date_difference
DATE DATE DATE INTEGER
2012-12-01 2012-12-01 2012-12-01 46
两个日期之间的差应该是一个整数。你应该只INTERVAL
在计算值之间的差异时得到一个DATETIME
。
我现在手头没有 Informix 实例,但我怀疑该to_date()
函数的使用会导致DATETIME
数学运算。
我可以看到您已经提出了解决方案,但请尝试以下方法,这会更简单:
SELECT today - TO_DATE('20121201', '%Y%m%d')::DATE AS td FROM tb_dis_controll