我正在使用一个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
两个日期之间的差值应该是整数。当计算DATETIME
值之间的差值时,您应该只得到INTERVAL
。
我现在手边没有Informix实例,但是我怀疑使用to_date()
函数会导致DATETIME
math。
我知道你已经想出了一个解决方案,但请尝试以下方法,这将比更简单:
SELECT today - TO_DATE('20121201', '%Y%m%d')::DATE AS td FROM tb_dis_controll