2009-12-18 27 views
1

我有一個定義時間間隔的表。查詢以從表中選擇時間間隔

_______________________________ 
| id | description | start_date | 
|____|_____________|____________| 
| 1 | First  | NULL | 
| 3 | Third  | 2009-12-18 | 
| 5 | Second  | 2009-10-02 | 
| 4 | Last  | 2009-12-31 | 
|____|_____________|____________| 

它只存儲開始日期,結束日期是下一個日期之前的一天。

我想有下一個結果:

____________________________________________ 
| id | description | start_date | end_date | 
|____|_____________|____________|____________| 
| 1 | First  | NULL | 2009-10-01 | 
| 5 | Second  | 2009-10-02 | 2009-12-17 | 
| 3 | Third  | 2009-12-18 | 2009-12-30 | 
| 4 | Last  | 2009-12-31 | NULL | 
|____|_____________|____________|____________| 

我應該怎麼寫這個查詢,因爲行包含從其他行的值?

(我認爲MySQL的函數DATE_SUB可能是有用的。)

回答

2
SELECT d.id, d.description, MIN(d.start_date), MIN(d2.start_date) - INTERVAL 1 
DAY AS end_date 
FROM start_dates d 
LEFT OUTER JOIN start_dates d2 ON (d2.start_date > d.start_date OR d.start_date IS NULL) 
GROUP BY d.id, d.description 
ORDER BY d.start_date ASC 
+0

返回重複的行 – 2009-12-18 19:00:54

+0

你會得到什麼重複的行?一個id不止一行? GROUP BY應該避免這種情況... – 2009-12-18 19:19:51

+0

對不起,我錯了。它正在工作。非常感謝。 – 2009-12-18 19:32:56

0

如果你正在使用PHP,只是計算腳本中的一個日期。這很容易。

如果沒有,會是這樣的:

SELECT ID,description,start_date,start_date-1 AS end_date FROM ... 

工作?

UPDATE:它的工作原理部分,因爲它返回20091224的開始日期2009-12-25但對於像日期2009-12-01等

0

將無法​​正常工作嘗試

Select d.Id, d.Description, d.Start_Date, 
     n.Start_Date - 1 EndDate 
    From Table d 
    Left Join Table n 
     On n.Start_Date = 
       (Select Min(Start_date) 
       From Table 
       Where Start_Date > Coalesce(d.Start_Date, '1/1/1900') 
+0

不工作:返回太多行 – 2009-12-18 19:01:43

+0

什麼其他行是其返回。如果您的數據如上所述,則應在表中每行返回一行。 – 2009-12-18 21:47:30

+0

對於'start_date'和'end_date',第一行具有'NULL' – 2009-12-19 20:14:36

2

嘗試

select id, description, start_date, end_date from 
    (
    select @rownum_start:[email protected]_start+1 rank, id, description, start_date 
    from inter, (select @rownum_start:=0) p 
    order by start_date 
) start_dates 
left join 
    (
    select @rownum_end:[email protected]_end+1 rank, start_date - interval 1 day as end_date 
    from inter, (select @rownum_end:=0) p 
    where start_date is not null 
    order by start_date 
) end_dates 
using (rank) 

其中inter是你的表

這實際上返回:

mysql> select id, description, start_date, end_date from ... 
+----+-------------+------------+------------+ 
| id | description | start_date | end_date | 
+----+-------------+------------+------------+ 
| 1 | First  | NULL  | 2009-10-01 | 
| 5 | Second  | 2009-10-02 | 2009-12-17 | 
| 3 | Third  | 2009-12-18 | 2009-12-30 | 
| 4 | Last  | 2009-12-31 | NULL  | 
+----+-------------+------------+------------+ 
4 rows in set (0.00 sec) 
+0

(+ 1)謝謝,它的作品。不過,我接受Peter Lang的解決方案,因爲它更簡單。 – 2009-12-18 19:32:00

+0

是的,如果我有選擇,我更喜歡彼得的解決方案太:-) – 2009-12-18 19:40:24