首页 > 解决方案 > 如何计算一个时间段之间的条目数

问题描述

我在下面有一个示例表,其中显示了票号、票的打开时间和关闭时间。

TKTNUM  OPEN_DATE           CLOSE_DATE
1234    12-Mar-19 08:36     14-Mar-19 08:36
1235    13-Mar-19 08:36     15-Mar-19 08:36
1236    14-Mar-19 08:36     16-Mar-19 08:36
1237    15-Mar-19 08:36 
1238    16-Mar-19 08:36 
1239    17-Mar-19 08:36 
1240    18-Mar-19 08:36     20-Mar-19 08:36
1241    19-Mar-19 08:36     20-Mar-19 08:36
1242    20-Mar-19 08:36     21-Mar-19 08:36

我需要计算某一天的打开/关闭票的数量......

DATE                OPEN        CLOSED
12-Mar-19 08:36     1           0
13-Mar-19 08:36     2           0
14-Mar-19 08:36     2           1
15-Mar-19 08:36     2           2
16-Mar-19 08:36     2           3
17-Mar-19 08:36     3           3
18-Mar-19 08:36     4           3
19-Mar-19 08:36     5           3
20-Mar-19 08:36     4           5

任何帮助是极大的赞赏。谢谢


在示例 job_history 表上使用了下面的查询(c/o Tejash)

EMPLOYEE_ID START_DATE           END_DATE             JOB_ID     DEPARTMENT_ID
----------- -------------------- -------------------- ---------- -------------
        200 17/SEP/1995 00:00:00 17/JUN/2001 00:00:00 AD_ASST               90
        101 21/SEP/1997 00:00:00 27/OCT/2001 00:00:00 AC_ACCOUNT           110
        102 13/JAN/2001 00:00:00 24/JUL/2006 00:00:00 IT_PROG               60
        101 28/OCT/2001 00:00:00 15/MAR/2005 00:00:00 AC_MGR               110
        200 01/JUL/2002 00:00:00 31/DEC/2006 00:00:00 AC_ACCOUNT            90
        201 17/FEB/2004 00:00:00 19/DEC/2007 00:00:00 MK_REP                20
        114 24/MAR/2006 00:00:00 31/DEC/2007 00:00:00 ST_CLERK              50
        176 24/MAR/2006 00:00:00 31/DEC/2006 00:00:00 SA_REP                80
        176 01/JAN/2007 00:00:00 31/DEC/2007 00:00:00 SA_MAN                80
        122 01/JAN/2007 00:00:00 31/DEC/2007 00:00:00 ST_CLERK              50

With dates(dt)
As (Select mindt + level - 1 from
        (Select min(start_date) mindt, max(end_date) maxdt from job_history)
      Connect by level <= maxdt - mindt + 1)
Select dt, 
       sum(case when dt between start_date and coalesce(end_date,dt) then 1 end) as startdate, 
       Sum(case when dt >= end_date then 1 end) as enddate
From dates cross join job_history
Group by dt 
Order by dt desc

2001 年 6 月 17 日,查询给出了

DT                    STARTDATE    ENDDATE
-------------------- ---------- ----------
31/DEC/2007 00:00:00          3         10
<SNIPPED>
17/JUN/2001 00:00:00          3          1

代替

DT                    STARTDATE    ENDDATE
-------------------- ---------- ----------
31/DEC/2007 00:00:00          3         10
<SNIPPED>
17/JUN/2001 00:00:00          2          1

试图编辑查询,现在它给了我

DT                    STARTDATE    ENDDATE
-------------------- ---------- ----------
31/DEC/2007 00:00:00             <<<    10   
<snipped>
18/JUN/2001 00:00:00          2          1
17/JUN/2001 00:00:00          2  <<<     1   
16/JUN/2001 00:00:00          3          1

标签: sqloracle

解决方案


您可以将日期用作总天数的 cte,并使用以下相同的表再次加入它:

With dates(dt)
As
(
Select mindt + level - 1 from
  (Select min(open_date) mindt, max(open_dt) maxdt from your_table)
Connect by level <= maxdt - mindt + 1
)
Select dt, 
       sum(case when dt between open_date and coalesce(close_date,dt) then 1 end) as open, 
       Sum(case when dt >= close_date then 1 end) as closed
From dates cross join your_table
Group by dt;

干杯!!


推荐阅读