选择Where Date Between

时间:2014-07-22 11:44:32

标签: sql oracle select

我想选择一个表日历,并将结果与​​该月的日期结合起来。 我的意思是,

表:日历

ID  TEAM     EMPLOYER         START                     END
17  19          8       04/08/2014 18:01:00     11/08/2014 07:59:00
18  19          39      11/08/2014 18:01:00     18/08/2014 07:59:00
19  19          44      18/08/2014 18:01:00     25/08/2014 07:59:00
20  19          38      25/08/2014 18:01:00     01/09/2014 07:59:00

我在这个月的日子里有一个SELECT。

Select Days.Dt
  From (Select Trunc(To_Date('2014', 'YYYY'), 'y') - 1 + Rownum Dt
          From All_Objects
         Where Rownum <= Add_Months(Trunc(To_Date('2014', 'YYYY'), 'y'), 12) -
               Trunc(To_Date('2014', 'YYYY'), 'y')) Days
  Where To_Char(Dt, 'mm/yyyy') = '08/2014'

我想要的是这样的:

        DAY             EMPLOYER_END                EMPLOYER_START
1   01/08/2014          
2   02/08/2014
3   03/08/2014
4   04/08/2014                                          4
5   05/08/2014                4                         4
6   06/08/2014                4                         4
7   07/08/2014                4                         4
8   08/08/2014                4                         4
9   09/08/2014                4                         4
10  10/08/2014                4                         4
11  11/08/2014                4                         39
12  12/08/2014                39                        39

雇主于18:01(始终)开始,并于07:59(总是)结束。

有谁知道它是否可能? 我可以这样做。

谢谢!

2 个答案:

答案 0 :(得分:1)

您想要的结果与您的样本数据不符。但是,我想你想要这样的东西:

with dates as (
      Select Days.Dt
      From (Select Trunc(To_Date('2014', 'YYYY'), 'y') - 1 + Rownum Dt
            From All_Objects
            Where Rownum <= Add_Months(Trunc(To_Date('2014', 'YYYY'), 'y'), 12) -
                            Trunc(To_Date('2014', 'YYYY'), 'y')
           ) Days
      Where To_Char(Dt, 'mm/yyyy') = '08/2014'
     )
select d.dt,
       sum(case when c.employer_start = d.ddt then 0 else 1 end) as employer_end,
       sum(case when c.employer_end = d.dt then 1 else 0 end) as employer_start
from dates d left outer join
     calendar c
     on d.dt between c.employer_start and c.employer_end
group by d.dt
order by d.dt;

答案 1 :(得分:0)

我想这对你有用

WITH mindates AS
  (SELECT TRUNC(MIN(startdate),'month') st_date,
    TRUNC(MAX(enddate)) ed_date
  FROM calendar
  ) ,
  dates AS
  (SELECT st_date+ rownum-1 AS dates_col
  FROM mindates,
    dual
    CONNECT BY rownum <= (ed_date- st_date)+1
  )
SELECT d.dates_col dates,
  MIN((
  CASE
    WHEN d.dates_col=c.startdate
    THEN NULL
    ELSE c.employer
  END)) AS employer_end,
  MIN((
  CASE
    WHEN d.dates_col=c.enddate
    THEN NULL
    ELSE c.employer
  END )) AS employer_start
FROM dates d
LEFT OUTER JOIN calendar c
ON d.dates_col BETWEEN c.startdate AND c.enddate
GROUP BY d.dates_col
ORDER BY d.dates_col;