在DB2中计算两个日期之间的天数?

14

我需要在DB2中获取两个日期之间的天数差。我尝试了几个不同的查询,但没有任何结果。所以基本上我需要得到的是这样。

 SELECT DAYS (CURRENT DATE) - DAYS (DATE(CHDLM)) FROM CHCART00 WHERE CHSTAT = '05';

我知道如果我删除CHDLM并指定一个日期,比如“2012-02-20”,这个查询可以正常工作,但是我需要能够针对表中的该字段运行此查询。我也尝试了一个我朋友给我的查询,但它也没有起作用。

 select days (current date) - days (date(select concat(concat(concat(concat(left(a2.chdlm,4),'-'),substr(a2.chdlm,4,2)),'-'),right(a2.chdlm,2))) from sysibm.sysdummy1 a1, chcart00 a2 where chstat = '05';

请帮忙,非常感激。谢谢


看起来您的列数据类型存在问题... - Teja
5个回答

17
我认为 @Siva 的做法是正确的(使用 DAYS()),但嵌套的 CONCAT() 让我感到眼花缭乱。 这是我的方法。
哦,没有必要引用 sysdummy1,因为无论如何都需要从表中提取数据。
另外,不要使用隐式连接语法 - 它被认为是 SQL 反模式。
在这里,我将日期转换包装在 CTE 中以便阅读,但是你也可以内联执行它。
WITH Converted (convertedDate) as (SELECT DATE(SUBSTR(chdlm, 1, 4) || '-' ||
                                               SUBSTR(chdlm, 5, 2) || '-' ||    
                                               SUBSTR(chdlm, 7, 2))
                                   FROM Chcart00
                                   WHERE chstat = '05')

SELECT DAYS(CURRENT_DATE) - DAYS(convertedDate)
FROM Converted

抱歉,还有一个问题,如果我需要从CHCART00表中选择更多字段,我该怎么做? - jorame

4
在一个Java桌面应用程序中,我在Derby IBM DB2嵌入式数据库中遇到了同样的问题,在搜索了一天后,我终于找到了解决方法:
SELECT days (table1.datecolomn) - days (current date) FROM table1 WHERE days (table1.datecolomn) - days (current date) > 5

了解更多信息,请访问该网站


1
只有在日期始终在同一个月份中才能使用此方法。(day 仅返回月中的天数) 使用 days 应该适用于一般情况,因为它返回自纪元以来的天数。 - Brad Mace

0
values timestampdiff (16, char( 
    timestamp(current timestamp + 1 year + 2 month - 3 day)- 
    timestamp(current timestamp)))
1
=
422



values timestampdiff (16, char( 
    timestamp('2012-03-08-00.00.00')- 
    timestamp('2011-12-08-00.00.00')))
1
=
90

---------- 由galador编辑

SELECT TIMESTAMPDIFF(16, CHAR(CURRENT TIMESTAMP - TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD'))
FROM CHCART00
WHERE CHSTAT = '05'

编辑

正如X-Zero所指出的那样,此函数仅返回一个估计值。这是正确的。为了获得两个日期a和b之间的天数差异的准确结果,我建议使用以下方法:

SELECT days (current date) - days (date(TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD')))
FROM CHCART00 
WHERE CHSTAT = '05';

我该如何在我的查询中准确实现这个功能? - jorame
我加入了一个查询,我认为它应该可以得到您想要的结果(假设CHDLM是日期或时间戳类型,或格式正确的字符串)。 - bhamby
CHDLM的格式是yyyymmdd,您认为使用这个查询是否可行? - jorame
还有一件事,这个数据库是DB2。 - jorame
您可以使用TIMESTAMP_FORMAT()函数将字符串转换为TIMESTAMP。我更新了我的部分以使用此函数。 - bhamby
1
不幸的是,此函数仅返回一个估计值。除其他事项外,它假定每个月只有30天... - Clockwork-Muse

0

看起来在right(a2.chdlm,2)))) from sysibm.sysdummy1 a1,处缺少一个右括号。

因此,您的查询将是:

select days(current date) - days(date(select concat(concat(concat(concat(left(a2.chdlm,4),'-'),substr(a2.chdlm,4,2)),'-'),right(a2.chdlm,2)))) from sysibm.sysdummy1 a1, chcart00 a2 where chstat = '05';

无法工作,我收到了一个“Token CONCAT无效。有效的令牌:(,”错误。 - jorame

0

这不就是吗:

SELECT CURRENT_DATE - CHDLM FROM CHCART00 WHERE CHSTAT = '05';

如果我正确理解了DB2中日期算术的工作原理,那么应该返回两个日期之间的天数。

如果CHDLM不是日期格式,您需要将其转换为日期格式。根据IBM的说法,DATE()函数对于yyyymmdd格式不足够,但如果您可以按照yyyy-mm-dd格式进行格式化,则可以使用它。


不幸的是,即使起始格式有效,这些操作的结果是一个“无限期”(即2个月、3天),而且OP明确要求得到天数。 - Clockwork-Muse
啊,抱歉,应该是 DAYS(CURRENT_DATE) - DAYS(CHDLM)。 - David Faber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接