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同样的效果。

时间: 2024-10-12 20:53:04

DB2日期分组计算数据值的相关文章

DB2 日期时间函数

db2日期时间函数 (DATE(TRIM(CHAR(DT#11Y))||'-'||TRIM(CHAR(DT#11M))||'-'||TRIM(CHAR(DT#11D))) BETWEEN DATE('" & strDate1 & "') AND DATE('" & strDate2 & "')) (Y > y) OR ((Y = y) AND (M > m)) OR ((Y = y) AND (M = m) AND (D

Mysql日期分组无数据查询填充0

前言 这篇文章标题不好取...(主要是生成连续的日期),本文关键点有:Mysql 获取指定时间段内的所有日期列表, Mysql 按照日期分组查询没有数据的日期也一并查询出来. 本文原文链接地址:http://nullpointer.pw/Mysql%E6%97%A5%E6%9C%9F%E5%88%86%E7%BB%84%E6%97%A0%E6%95%B0%E6%8D%AE%E6%9F%A5%E8%AF%A2%E5%A1%AB%E5%85%850.html 问题 产品提出一个需求,需要展示这样的一

php 日期 - 计算2个日期的差值

1 /** 2 * 日期-计算2个日期的差值 3 * @return int 4 */ 5 public function get_difference($date, $new_date) { 6 $date = strtotime($date); 7 $new_date = strtotime($new_date); 8 return abs(ceil(($date - $new_date)/86400)); 9 }

PHP中比较两个时间的大小与日期的差值

在这里我们全用到时间戳 mktime(hour,minute,second,month,day,year,[is_dst])     其参数可以从右向左省略,任何省略的参数都会被设置成本地日期和时间的当前值. 参数 描述 hour 可选.规定小时. minute 可选.规定分钟. second 可选.规定秒. month 可选.规定用数字表示的月. day 可选.规定天. year 可选.规定年.在某些系统上,合法值介于 1901 – 2038 之间.不过在 php教程 5 中已经不存在这个限制

python datatime日期和时间值模块

datetime.time():是一个时间类,这个类接受4个参数,分别代表时,分,秒,毫秒.参数的默认值是为0 1 #!/usr/bin/env python 2 #coding:utf8 3 import datetime 4 t=datetime.time(20, 00, 13, 00) 5 print t 6 print '*'*20 7 print t.hour 8 print t.minute 9 print t.second 10 print t.microsecond 11 12

日期和毫秒值 例子

package cn.zmh.Date; import java.util.Date; public class DateDemo2 {    public static void main(String[] args) {        print2();    }    // 空参构造   获取到的是当前系统中的时间和日期    public static void print(){        Date d = new Date();        System.out.println(

DB2日期和时间函数汇总

上一篇提到过在DB2中,可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值.则在这篇中,我们直接用VALUES关键字来看看这些函数. 1.CURRENT DATE获取当前日期:CURRENT TIME获取当前时间:CURRENT TIMESTAMP获取当前时间戳(含年.月.日.时.分.秒):YEAR()获取年:MONTH()获取月:DAY()获取日: HOUR()获取小时:MINUTE()获取分钟:SECOND()获取秒

DB2日期与时间

摘选自:http://www.cnblogs.com/wanghonghu/archive/2012/05/25/2518604.html 1.db2可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值. SELECT 'HELLO DB2' FROM SYSIBM.SYSDUMMY1;--HELLO DB2 SELECT 'HELLO DB2' FROM SYSIBM.DUAL;--HELLO DB2 VALUES 'H

DB2——db2日期和时间常用汇总

1.db2可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值. SELECT 'HELLO DB2' FROM SYSIBM.SYSDUMMY1;--HELLO DB2 SELECT 'HELLO DB2' FROM SYSIBM.DUAL;--HELLO DB2 VALUES 'HELLO DB2';--HELLO DB2 2.CURRENT DATE获取当前日期:CURRENT TIME获取当前时间:CURRENT