2013-01-14 53 views
-1

往返日期我有這個表看起來像這樣:查詢在給定範圍內

PersonnelId 
AbsenceReason 
AbsenceFrom 
AbsenceTo 

現在我想返回以下結果的查詢。 我提供了一個日期範圍,以及它應該返回的所有日期,無論該人是否缺席。 例如:

PersonnelId = 4 
AbsenceReason = Holiday 
AbsenceFrom = 2/12/2012 
AbsenceTo = 10/12/2012 

當我運行查詢我給十二月輸入的月份。 我想結果顯示如下:

1/12/2012 "Available" 
2/12/2012 "Holiday" 
3/12/2012 "Holiday" 
... 
11/12/2012 "Available" 
... 
+0

同意,http://whathaveyoutried.com? –

+0

你約會的格式是什麼? – duffy356

+0

我的日期是DD/MM/YYYY。 –

回答

1

是這樣的:

SQL> create table person (PersonnelId primary key, AbsenceReason , AbsenceFrom , AbsenceTo) 
    2 as 
    3 select 4, 'Holiday', '2/12/2012', '10/12/2012' 
    4 from dual; 

Table created. 

剛剛設置的to_date('12-2012', 'mm-yyyy')適用的月/年:

SQL> with mon as (select d 
    2     from (select to_date('12-2012', 'mm-yyyy') + rownum - 1 d 
    3       from dual 
    4      connect by level <= 31) 
    5    where trunc(d, 'mm') = to_date('12-2012', 'mm-yyyy')) 
    6 select personnelId, m.d, 
    7   case 
    8   when m.d between p.AbsenceFrom and p.AbsenceTo then 'Holiday' 
    9   else 'Available' 
10   end absent 
11 from mon m 
12   cross join person p 
13 order by 1, 2; 

PERSONNELID D   ABSENT 
----------- ---------- --------- 
      4 01/12/2012 Available 
      4 02/12/2012 Holiday 
      4 03/12/2012 Holiday 
      4 04/12/2012 Holiday 
      4 05/12/2012 Holiday 
      4 06/12/2012 Holiday 
      4 07/12/2012 Holiday 
      4 08/12/2012 Holiday 
      4 09/12/2012 Holiday 
      4 10/12/2012 Holiday 
      4 11/12/2012 Available 
      4 12/12/2012 Available 
      4 13/12/2012 Available 
      4 14/12/2012 Available 
      4 15/12/2012 Available 
      4 16/12/2012 Available 
      4 17/12/2012 Available 
      4 18/12/2012 Available 
      4 19/12/2012 Available 
      4 20/12/2012 Available 
      4 21/12/2012 Available 
      4 22/12/2012 Available 
      4 23/12/2012 Available 
      4 24/12/2012 Available 
      4 25/12/2012 Available 
      4 26/12/2012 Available 
      4 27/12/2012 Available 
      4 28/12/2012 Available 
      4 29/12/2012 Available 
      4 30/12/2012 Available 
      4 31/12/2012 Available 
0

這是否幫助你嗎?請嘗試:

SELECT date_col, NVL(AbsenceReason, 'Available') AS Reason 
FROM (SELECT To_date('01-JUN-2012', 'dd-mon-yyyy') 
       + LEVEL - 1 AS date_col 
     FROM dual 
     CONNECT BY LEVEL <= To_date('06-JUL-2012', 'dd-mon-yyyy') - 
          To_date('01-JUN-2012', 'dd-mon-yyyy') + 
             1)d 
     left join yourtable t1 
      ON d.date_col BETWEEN t1.absencefrom AND t1.absenceto; 

在這個例子中'01-JUN-2012'是日期和'06-JUL-2012'是最新的。