最近参与的项目进行了一次优化技改,对其中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同样的效果。