PL / SQL - 计算重叠时间段之间的不同天数

时间:2015-10-01 20:54:44

标签: oracle plsql oracle11g

嘿伙计们。

嘿伙计们。想象一下这个场景(YYYY / MM / DD):

XmlNode

使用PL / SQL可以计算这些重叠日期之间的不同天数吗?

编辑:我的表有2个DATE列,Start_Date和End_Date。我期待的结果是515天((2015/08/10 - 2014/10/03)+(2016/04/28 -2015/09/30))

2 个答案:

答案 0 :(得分:4)

您也可以使用纯SQL(不需要PL / SQL):

    with 
    minmax as (select min(start_date) min_dt, max(end_date) max_dt from myTable ), 
    dates as (
SELECT min_dt + rownum-1 dt1
FROM minmax CONNECT BY ROWNUM <= (max_dt - min_dt +1)
)
select count(*) from dates
where exists( 
 select 1 from MyTable T2 
 where dates.dt1 between T2.start_date and T2.end_date )

注意:一个想法,从头开始,没有经过测试。根据需要调整生成日期,包括开始日期和所需长度。

希望它有所帮助。

编辑:使用实际的表格日期

答案 1 :(得分:2)

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE DATES ( start_date, end_date ) AS
          SELECT DATE '2015-01-01', DATE '2015-08-10' FROM DUAL
UNION ALL SELECT DATE '2014-10-03', DATE '2015-07-06' FROM DUAL
UNION ALL SELECT DATE '2015-09-30', DATE '2016-04-28' FROM DUAL

查询1

SELECT COUNT( DISTINCT COLUMN_VALUE ) AS number_of_days
FROM   DATES d,
       TABLE(
         CAST(
           MULTISET(
             SELECT d.START_DATE + LEVEL - 1
             FROM   DUAL
             CONNECT BY d.START_DATE + LEVEL - 1 < d.END_DATE
           )
           AS SYS.ODCIDATELIST
         )
       )
ORDER BY 1

<强> Results

| NUMBER_OF_DAYS |
|----------------|
|            522 |

查询2 - 检查

SELECT DATE '2015-08-10' - DATE '2014-10-03'
     + DATE '2016-04-28' - DATE '2015-09-30'
FROM   DUAL

<强> Results

| DATE'2015-08-10'-DATE'2014-10-03'+DATE'2016-04-28'-DATE'2015-09-30' |
|---------------------------------------------------------------------|
|                                                                 522 |