首页 > 代码库 > DB2日期分组计算数据值

DB2日期分组计算数据值

最近参与的项目进行了一次优化技改,对其中SQL参数化公用方法进行了改造。又因项目组人员调整,接受其他模块。针对这次改造,自己负责的模块都要测试到底。

然后再测试过程发现,一个针对日期分组计算的SQL报错,报SQL语句超长的异常。

举个栗子,功能要求如下:

表table_test中

ID           AMOUNT         CREATE_DATE

1            100                   2014-01-01

2            100                   2014-01-09

3            100                   2014-01-11

4            100                   2014-01-12

5            100                   2014-01-21

6            100                   2014-01-22

7            100                   2014-01-24

从表中按CREAT_DATE每10天作为一个分组,统计总金额

之前的SQL是这样的

SELECT SUM(AMOUT) AS TOTALAMOUNT FORM TABLE_TEST 
WHERE CREATE_DATE BETWEEN ‘2014-01-01‘ AND ‘2014-01-10‘
UNION ALL
SELECT SUM(AMOUT) AS TOTALAMOUNT FORM TABLE_TEST 
WHERE CREATE_DATE BETWEEN ‘2014-01-11‘ AND ‘2014-01-20‘
UNION ALL
SELECT SUM(AMOUT) AS TOTALAMOUNT FORM TABLE_TEST 
WHERE CREATE_DATE BETWEEN ‘2014-01-21‘ AND ‘2014-01-30‘

这样的问题是,一方面程序逻辑更负责,需要算计每10天时间间隔的起始日期,还一个一个方面SQL语句冗长,日期跨度大的话,就明显了,直接导致程序抛异常。

下面是改进的SQL

SELECT SUM(AMOUNT) AS TOTALAMOUNT , (days(CREATE_DATE)-days(‘2014-01-01‘))/10 AS TIMESAPN 
FROM TABLE_TEST GROUP BY TIMESAPN

关键点是

(days(CREATE_DATE) - days(‘2014-01-01‘))/10 AS TIMESAPN

TIMESAPN为0则表示该记录在第一个10天周期内,为1表示在第二个10天周期内,以此类推,最后以此字段作为分组条件,就可以达到上面SQL同样的效果。




DB2日期分组计算数据值