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 (
char(  timestamp('2002-11-30 00:00:00')-  timestamp('2002-11-08  00:00:00')))  
对于 ,可以使用以下各值来替代,以指出结果的时间单位:  
1 = 秒的小数部分   
2 = 秒   
4 = 分   
8 = 时   
16 = 天  
32 = 周   
64 = 月   
128 = 季度
256 = 年   





你可能感兴趣的:(数据库)