//生成时间段内连续日期

select * from
( select date('2008-01-01') + (row_NUMBER() over () -1) days AS datennn
from sysibm.syscoldist )
where datennn < date ('2013-01-01')

//生成时间段内所有节点的笛卡尔积

select a.COMP_NAME, a.COMP_ID,b.datennn from MANAGE8_BASE_NODE_INFO a,
(
select * from
( select date('2017-01-01') + (row_NUMBER() over () -1) days AS datennn
from sysibm.syscoldist )
where datennn < date ('2017-01-30')
) b
where a.NODE_TYPE='0005

//查询出进场数据为空的节点数据

select c.NODE_NAME,c.NODE_ID,c.COLLECT_DATE,COALESCE(b.VEG_IN_COUNT,0),COALESCE(b.MEAT_IN_COUNT,0) from (
select a.COMP_NAME as NODE_NAME , a.COMP_ID as NODE_ID,b.datennn as COLLECT_DATE from MANAGE8_BASE_NODE_INFO a,
(
select * from
( select date('2017-01-01') + (row_NUMBER() over () -1) days AS datennn
from sysibm.syscoldist )
where datennn < date ('2017-01-30')
) b
where a.NODE_TYPE='0005'
) c left join
(select * from NODE_INFO_COLLECT where COLLECT_DATE >= '2017-01-01 00:00:00' and COLLECT_DATE <'2017-02-01 00:00:00' and NODE_TYPE='0005' ) b
on c.NODE_ID= b.NODE_ID

//下面是最终的sql,还没测试,有待修改

select DISTINCT tstart.NODE_ID,tstart.NODE_NAME,tstart.COLLECT_DATE from NODE_INFO_COLLECT as tstart ,NODE_INFO_COLLECT as tend
where tstart.NODE_ID = tend.NODE_ID
and (tstart.VEG_IN_COUNT+tstart.MEAT_IN_COUNT ) =0
and (tend.VEG_IN_COUNT+tend.MEAT_IN_COUNT ) >0
and tstart.NODE_TYPE='0005' and tend.NODE_TYPE='0005'
and tend.COLLECT_DATE >= DATE(tstart.COLLECT_DATE) + 3 days
and EXISTS (SELECT 1 FROM NODE_INFO_COLLECT AS TGood
WHERE TGood.NODE_ID = tstart.NODE_ID
AND (TGood.VEG_IN_COUNT+TGood.MEAT_IN_COUNT ) =0
AND TGood.COLLECT_DATE BETWEEN tstart.COLLECT_DATE AND tend.COLLECT_DATE
HAVING COUNT(TGood.NODE_ID) >=3)
AND NOT EXISTS (SELECT 1 FROM NODE_INFO_COLLECT AS TBad
WHERE TBad.NODE_ID = TStart.NODE_ID
AND (TBad.VEG_IN_COUNT+TBad.MEAT_IN_COUNT ) >0
AND TBad.COLLECT_DATE BETWEEN tstart.COLLECT_DATE AND tend.COLLECT_DATE)

//最后汇总sql,有待改进,执行效率慢

select DISTINCT tstart.NODE_ID,tstart.NODE_NAME,tstart.COLLECT_DATE
from
(
select tab1.NODE_NAME,tab1.NODE_ID,COALESCE(tab2.VEG_IN_COUNT,0) VEG_IN_COUNT,COALESCE(tab2.MEAT_IN_COUNT,0) MEAT_IN_COUNT,tab1.COLLECT_DATE from (
select c.NODE_NAME,c.NODE_ID,c.COLLECT_DATE from (
select a.COMP_NAME as NODE_NAME , a.COMP_ID as NODE_ID,b.datennn as COLLECT_DATE from MANAGE8_BASE_NODE_INFO a,
(
select * from
( select date('2017-01-01') + (row_NUMBER() over () -1) days AS datennn
from sysibm.syscoldist )
where datennn < date ('2017-02-01')
) b
where a.COMP_ID='410105095'
) c
) tab1 left join
(
select NODE_NAME,NODE_ID,VEG_IN_COUNT,MEAT_IN_COUNT,COLLECT_DATE from NODE_INFO_COLLECT
where COLLECT_DATE >= '2017-01-01 00:00:00' and COLLECT_DATE <'2017-02-01 00:00:00' and NODE_ID='410105095'
) tab2
on tab1.NODE_ID=tab2.NODE_ID and date(tab1.COLLECT_DATE) = date(tab2.COLLECT_DATE)
) tstart ,
(
select tab1.NODE_NAME,tab1.NODE_ID,COALESCE(tab2.VEG_IN_COUNT,0) VEG_IN_COUNT,COALESCE(tab2.MEAT_IN_COUNT,0) MEAT_IN_COUNT,tab1.COLLECT_DATE from (
select c.NODE_NAME,c.NODE_ID,c.COLLECT_DATE from (
select a.COMP_NAME as NODE_NAME , a.COMP_ID as NODE_ID,b.datennn as COLLECT_DATE from MANAGE8_BASE_NODE_INFO a,
(
select * from
( select date('2017-01-01') + (row_NUMBER() over () -1) days AS datennn
from sysibm.syscoldist )
where datennn < date ('2017-02-01')
) b
where a.COMP_ID='410105095'
) c
) tab1 left join
(
select NODE_NAME,NODE_ID,VEG_IN_COUNT,MEAT_IN_COUNT,COLLECT_DATE from NODE_INFO_COLLECT
where COLLECT_DATE >= '2017-01-01 00:00:00' and COLLECT_DATE <'2017-02-01 00:00:00' and NODE_ID='410105095'
) tab2
on tab1.NODE_ID=tab2.NODE_ID and date(tab1.COLLECT_DATE) = date(tab2.COLLECT_DATE)
) tend
where tstart.NODE_ID = tend.NODE_ID
and (tstart.VEG_IN_COUNT+tstart.MEAT_IN_COUNT ) =0
and (tend.VEG_IN_COUNT+tend.MEAT_IN_COUNT ) =0
and DATE(tend.COLLECT_DATE) = DATE(tstart.COLLECT_DATE) + 1 days
and EXISTS (SELECT 1 FROM
(
select tab1.NODE_NAME,tab1.NODE_ID,COALESCE(tab2.VEG_IN_COUNT,0) VEG_IN_COUNT,COALESCE(tab2.MEAT_IN_COUNT,0) MEAT_IN_COUNT,tab1.COLLECT_DATE from (
select c.NODE_NAME,c.NODE_ID,c.COLLECT_DATE from (
select a.COMP_NAME as NODE_NAME , a.COMP_ID as NODE_ID,b.datennn as COLLECT_DATE from MANAGE8_BASE_NODE_INFO a,
(
select * from
( select date('2017-01-01') + (row_NUMBER() over () -1) days AS datennn
from sysibm.syscoldist )
where datennn < date ('2017-02-01')
) b
where a.COMP_ID='410105095'
) c
) tab1 left join
(
select NODE_NAME,NODE_ID,VEG_IN_COUNT,MEAT_IN_COUNT,COLLECT_DATE from NODE_INFO_COLLECT
where COLLECT_DATE >= '2017-01-01 00:00:00' and COLLECT_DATE <'2017-02-01 00:00:00' and NODE_ID='410105095'
) tab2
on tab1.NODE_ID=tab2.NODE_ID and date(tab1.COLLECT_DATE) = date(tab2.COLLECT_DATE)
)
TGood
WHERE TGood.NODE_ID = tstart.NODE_ID
AND (TGood.VEG_IN_COUNT+TGood.MEAT_IN_COUNT ) =0
AND TGood.COLLECT_DATE BETWEEN tstart.COLLECT_DATE AND tend.COLLECT_DATE
HAVING COUNT(TGood.NODE_ID) >=2)
AND NOT EXISTS (SELECT 1 FROM
(
select tab1.NODE_NAME,tab1.NODE_ID,COALESCE(tab2.VEG_IN_COUNT,0) VEG_IN_COUNT,COALESCE(tab2.MEAT_IN_COUNT,0) MEAT_IN_COUNT,tab1.COLLECT_DATE from (
select c.NODE_NAME,c.NODE_ID,c.COLLECT_DATE from (
select a.COMP_NAME as NODE_NAME , a.COMP_ID as NODE_ID,b.datennn as COLLECT_DATE from MANAGE8_BASE_NODE_INFO a,
(
select * from
( select date('2017-01-01') + (row_NUMBER() over () -1) days AS datennn
from sysibm.syscoldist )
where datennn < date ('2017-02-01')
) b
where a.COMP_ID='410105095'
) c
) tab1 left join
(
select NODE_NAME,NODE_ID,VEG_IN_COUNT,MEAT_IN_COUNT,COLLECT_DATE from NODE_INFO_COLLECT
where COLLECT_DATE >= '2017-01-01 00:00:00' and COLLECT_DATE <'2017-02-01 00:00:00' and NODE_ID='410105095'
) tab2
on tab1.NODE_ID=tab2.NODE_ID and date(tab1.COLLECT_DATE) = date(tab2.COLLECT_DATE)
)
TBad
WHERE TBad.NODE_ID = TStart.NODE_ID
AND (TBad.VEG_IN_COUNT+TBad.MEAT_IN_COUNT ) >0
AND TBad.COLLECT_DATE BETWEEN tstart.COLLECT_DATE AND tend.COLLECT_DATE)

//加入临时物理表

create table TEST_NODE_COUNT as (
select tab1.NODE_NAME,tab1.NODE_ID,COALESCE(tab2.VEG_IN_COUNT,0) VEG_IN_COUNT,COALESCE(tab2.MEAT_IN_COUNT,0) MEAT_IN_COUNT,tab1.COLLECT_DATE from (
select c.NODE_NAME,c.NODE_ID,c.COLLECT_DATE from (
select a.COMP_NAME as NODE_NAME , a.COMP_ID as NODE_ID,b.datennn as COLLECT_DATE from MANAGE8_BASE_NODE_INFO a,
(
select * from
( select date('2017-01-01') + (row_NUMBER() over () -1) days AS datennn
from sysibm.syscoldist )
where datennn < date ('2017-02-01')
) b
where a.NODE_TYPE='0005'
) c
) tab1 left join
(
select NODE_NAME,NODE_ID,VEG_IN_COUNT,MEAT_IN_COUNT,COLLECT_DATE from NODE_INFO_COLLECT
where COLLECT_DATE >= '2017-01-01 00:00:00' and COLLECT_DATE <'2017-02-01 00:00:00' and NODE_TYPE='0005'
) tab2
on tab1.NODE_ID=tab2.NODE_ID and date(tab1.COLLECT_DATE) = date(tab2.COLLECT_DATE)
) definition only
select * from test_node_count
delete * from test_node_count

//核对信息

select * from (
select DISTINCT tstart.NODE_ID,tstart.NODE_NAME,tstart.COLLECT_DATE
from test_node_count tstart ,
(
select * from test_node_count
) tend
where tstart.NODE_ID = tend.NODE_ID
and (tstart.VEG_IN_COUNT+tstart.MEAT_IN_COUNT ) =0
and (tend.VEG_IN_COUNT+tend.MEAT_IN_COUNT ) =0
and DATE(tend.COLLECT_DATE) = DATE(tstart.COLLECT_DATE) + 2 days
and EXISTS (SELECT 1 FROM test_node_count TGood
WHERE TGood.NODE_ID = tstart.NODE_ID
AND (TGood.VEG_IN_COUNT+TGood.MEAT_IN_COUNT ) =0
AND TGood.COLLECT_DATE BETWEEN tstart.COLLECT_DATE AND tend.COLLECT_DATE
HAVING COUNT(TGood.NODE_ID) >=3)
AND NOT EXISTS (SELECT 1 FROM test_node_count TBad
WHERE TBad.NODE_ID = TStart.NODE_ID
AND (TBad.VEG_IN_COUNT+TBad.MEAT_IN_COUNT ) >0
AND TBad.COLLECT_DATE BETWEEN tstart.COLLECT_DATE AND tend.COLLECT_DATE)
) as tab where tab.node_id='410103023'

db2生成连续日期的更多相关文章

  1. sql生成连续日期(年份、月份、日期)

    此随笔主在分享日常可能用到的sql函数,用于生成连续日期(年份.月份.日期) 具体的看代码及效果吧! -- ============================================= ...

  2. sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期

    问题:在数据库脚本开发中,有时需要生成一堆连续数字或者日期,例如yearly report就需要连续数字做年份,例如daily report就需要生成一定时间范围内的每一天日期.而自带的系统表mast ...

  3. SQL经典问题 找出连续日期及连续的天数

    转自:http://bbs.csdn.net/topics/360019248 如何取到每段连续日期的起始终止日期以及持续天数及起始日期距上一期终止日期的天数,能否用一句sql实现?备注:数据库环境是 ...

  4. SQL 生成一个日期范围

    有时想按日或月生成一个序列,就像2014-1-1.2014-1-2.2014-1-3... 在sql server中可以写个函数来实现. /* 生成一个日期范围,如2014.01.2014.02... ...

  5. oracle行转列、列转行、连续日期数字实现方式及mybatis下实现方式

    转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9977591.html 九月份复习,十月份考试,十月底一直没法收心,赶在十一初 由于不可抗拒的原因又不得不重新找 ...

  6. python生成随机日期字符串

    python生成随机日期字符串 生成随机的日期字符串,用于插入数据库. 通过时间元组设定一个时间段,开始和结尾时间转换成时间戳. 时间戳中随机取一个,再生成时间元组,再把时间元组格式化输出为字符串 # ...

  7. MSSQL高并发下生成连续不重复的订单号

    一.确定需求 只要做过开发的基本上都有做过订单,只要做过订单的基本上都要涉及生成订单号,可能项目订单号生成规则都不一样,但是大多数规则都是连续增长. 所以假如给你一个这样的需求,在高并发下,以天为单位 ...

  8. oracle 生成随机日期+时间

    oracle 生成随机日期+时间 SELECT to_date(TRUNC(DBMS_RANDOM.VALUE(to_number(to_char(to_date('20110101','yyyymm ...

  9. 在论坛中出现的比较难的sql问题:33(递归 连续日期问题 )

    原文:在论坛中出现的比较难的sql问题:33(递归 连续日期问题 ) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必 ...

随机推荐

  1. PyQt4 UI设计和调用 使用eric6

    使用工具eric6 安装包地址: http://eric-ide.python-projects.org/eric-download.html 1.需要安装python和pyqt为前提,然后安装eri ...

  2. DEC VT100 terminal

  3. jQuery UI入门

    jQuery UI是jQuery的一个插件集,为jQuery的核心库添加了新的功能. jQUery UI库可以从http://jquery.com下载. 下载一个ZIP文件jquery-ui-1.9. ...

  4. 每天一个Linux命令(41)iostat命令

        iostat是I/O statistics(输入/输出统计)的缩写,对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况.     (1)用法:     ...

  5. 每天一个Linux命令(38)top命令

     top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.       (1)用法:       用法:  top  [参数] top是 ...

  6. $python正则表达式系列(2)——re模块常用函数

    本文主要介绍正则re模块的常用函数. 1. 编译正则 import re p = re.compile(r'ab*') print '[Output]' print type(p) print p p ...

  7. ERROR 2003 (HY000): Can't connect to MySQL server on "" (113)

    服务器为centos6. 这个原因是因为防火墙的问题 在mysql服务端执行 service iptables stop chkconfig iptables off #永久关闭防火墙 看情况执行 然 ...

  8. 一览Swift中的常用关键字

    要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在Swift中常用到的关键字. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...

  9. iOS如何获取蓝牙Mac地址

    http://macpu.github.io/2015/11/12/iOS%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E8%93%9D%E7%89%99Mac%E5%9C ...

  10. ubuntu 下使用vi时方向键乱码,退格键不能使用

    ubuntu 下使用vi时方向键乱码,退格键不能使用的解决方法 问题表现:Ubuntu下,初始使用vi,编辑模式下使用方向键的时候,并不会使光标移动,而是在命令行中出现A B C D 之类的字母,并且 ...