转载自:DB2数据库计算时间差
要求通过SQL计算出确认收货日期和发货日期之间的时间差(按天计算),因部分商品存在确认收货日期跨度较大的情况,所以在使用DB2提供的时间函数计算时出现了一些误差。
DB2提供了两个函数,分别是:timestampdiff 和 days。
举个栗子,计算2016-03-01 – 2016-02-01 之间的天数差(实际为29天)
SELECT
(days('2016-03-01') - days('2016-02-01')) AS diffDays,
timestampdiff(16,CHAR(TIMESTAMP('2016-03-01')-TIMESTAMP('2016-02-01'))) AS diffTimes16
FROM sysibm.sysdummy1;
输出结果: 29 30
再举!计算2015-03-01 – 2015-02-01 之间的天数差(实际为28天)
SELECT
(days('2015-03-01') - days('2015-02-01')) AS diffDays,
timestampdiff(16,CHAR(TIMESTAMP('2015-03-01')-TIMESTAMP('2015-02-01'))) AS diffTimes16
FROM sysibm.sysdummy1;
输出结果: 28 30
再举!计算 2016-02-01 – 2016-01-01 之间的天数差(实际为31天)
SELECT
(days('2016-02-01') - days('2016-01-01')) AS diffDays,
timestampdiff(16,CHAR(TIMESTAMP('2016-02-01')-TIMESTAMP('2016-01-01'))) AS diffTimes16
FROM sysibm.sysdummy1;
输出结果: 31 30
再举!计算 2016-03-01 – 2016-02-28之间的天数差(实际为2天)
SELECT
(days('2016-03-01') - days('2016-02-28')) AS diffDays,
timestampdiff(16,CHAR(TIMESTAMP('2016-03-01')-TIMESTAMP('2016-02-28'))) AS diffTimes16
FROM sysibm.sysdummy1;
输出结果: 2 2
再举!计算 2016-02-01 – 2016-01-28之间的天数差(实际为4天)
SELECT
(days('2016-02-01') - days('2016-01-28')) AS diffDays,
timestampdiff(16,CHAR(TIMESTAMP('2016-02-01')-TIMESTAMP('2016-01-28'))) AS diffTimes16
FROM sysibm.sysdummy1;
输出结果: 4 4
总结:通过输出结果可知,当时间相差不大时使用timestampdiff即可解决问题;当出现跨月且跨度超过一个月时,timestampdiff函数视每个月为30天计算,就会出现相应的误差,但days函数则更为精确的计算出天数差,不受大小月、跨月和平年闰年的影响;如果颗粒度仅到天数时,则建议使用days函数。
timestampdiff函数详细使用:
timestampdiff (<n>,
char( timestamp('2002-11-30 00:00:00')- timestamp('2002-11-08 00:00:00')))
对于 <n>,可以使用以下各值来替代,以指出结果的时间单位:
1 = 秒的小数部分
2 = 秒
4 = 分
8 = 时
16 = 天
32 = 周
64 = 月
128 = 季度
256 = 年