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

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. 安装MYSQL时出现libaio.so.1 is needed by MySQL-server-5.5,49.1等等

    安装MYSQL是出现: warning: MySQL-server--.linux2..i386.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: ...

  2. nodejs的精简型和全栈型开发框架介绍

    总体来说你可以将Node.js开发框架归结为两类: - 精简型框架 - 全栈型框架 下面我们就对这两种框架进行探讨. 精简型框架 精简型框架提供的是最基本的功能和APIs,这类框架本身就是被设计成用来 ...

  3. 20170520 BADI增强学习

    一.要求:Tcode:FF_5 导入数据运行时,产生财务凭证之前修改某些字段值.Exmp:FEBRE-VWEZWBKPF-XBLNRFEBEP-CHECTBSEG-ZUONR there is a b ...

  4. MySQL basics

    @1: MySQL有三大类数据类型, 分别为数字.日期\时间.字符串, 这三大类中又更细致的划分了许多子类型: 数字类型 整数: tinyint.smallint.mediumint.int.bigi ...

  5. Python基础(6)_函数

    一 为何要有函数? 不加区分地将所有功能的代码垒到一起,问题是: 代码可读性差 代码冗余 代码可扩展差 如何解决? 函数即工具,事先准备工具的过程是定义函数,拿来就用指的就是函数调用 结论:函数使用必 ...

  6. js文件操作

    IE下 1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码代码如下: Var fso=new ActiveXObject(Scripting.FileSys ...

  7. 每天一个Linux命令(43)at命令

        at命令用于在指定时间执行命令.at允许使用一套相当复杂的指定时间的方法.可以用相对时间法指定,也可以用绝对时间法指定.     (1)用法:     用法:  at  [选项参数]  [时间 ...

  8. java FileUtils 文件工具类

    package com.sicdt.library.core.utils; import java.io.BufferedInputStream; import java.io.File; impor ...

  9. Linux基本命令 网络命令

    概述 网络和监控命令类似于这些: hostname, ping, ifconfig, iwconfig, netstat, nslookup, traceroute, finger, telnet, ...

  10. HAproxy 介绍

    HAproxy 介绍 (1)HAProxy 是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy ...