2016-09-17 79 views
1

MySQL查詢可用日期我需要一些幫助查詢我的日曆/日期表SQL /數據庫

場景: 我有一個「日曆」表日期,用戶會設置自己的可用日期,通常是一天一天。所以,我的表看起來像這樣:

+------+------------+---------------------+---------------------+ 
| ID | user_id | start_date   | end_date   | 
+------+------------+---------------------+---------------------+ 
| 1 |   1 | 2016-09-01 08:00:00 | 2016-09-01 16:00:00 | 
| 2 |   1 | 2016-09-03 08:00:00 | 2016-09-03 16:00:00 | 
| 3 |   1 | 2016-09-04 08:00:00 | 2016-09-04 16:00:00 | 
| 3 |   1 | 2016-09-05 08:00:00 | 2016-09-05 16:00:00 | 
+------+------------+---------------------+---------------------+ 

這意味着用戶1可在第一,第三,第四和第五。

假設我想查詢表並查找用戶是否可以從日期2016-09-01 08:00:00到2016-09-05 16:00:00,此查詢必須返回零行,因爲用戶在9月2日不可用。但如果從2016-09-03 08:00:00到2016-09-05 16:00:00查詢,那麼它將返回這3行。

希望有人能幫助我解決這個

+1

可以開始日期和結束日期有所不同? – 1000111

+0

是的。否則,我只會有日期欄。但他們不能相互重疊。 –

+1

顯示用戶可用的所有行沒有任何意義。 –

回答

0

假設在表中的時間不重疊,你可以指望的天數。這一階段的日子是那麼:

select sum(datediff(least($period_end, end_date), 
        greatest($period_start, start_date) 
        ) + 1 
     ) 
from t 
where $period_start <= end_date and 
     $period_end >= start_date; 

然後,您可以通過比較來天數得到一個標誌:

select (case when sum(datediff(least($period_end, end_date), 
           greatest($period_start, start_date) 
          ) + 1 
        ) = 
        datediff($period_end, $period_start) + 1 
      then 1 else 0 
     end) as IsAvailableForAllDays 
from t 
where $period_start <= end_date and 
     $period_end >= start_date; 
2

這可能是一個辦法(單個用戶)。

注意@endDate@startDate是提供的搜索日期字段。

SELECT 
* 
FROM your_table 
WHERE EXISTS (
    SELECT 
    user_id 
    FROM your_table 
    WHERE start_date >= @startDate 
    AND start_date <= @endDate 
    AND user_id = 1 
    GROUP BY user_id 
    HAVING SUM((DATEDIFF(end_date,start_date)+1)) = DATEDIFF(@endDate,@startDate)+1 
) 
AND start_date >= @startDate 
AND start_date <= @endDate 
AND user_id = 1 

注:

如果提供的日期範圍落在由start_dateend_date(獨家)所約束的任何範圍內,那麼它將無法工作。

由於SUM((DATEDIFF(end_date,start_date)+1)) = DATEDIFF(@endDate,@startDate)+1在這種情況下將不相等。 條件

在這種情況下,您需要保持在所需的邊界內。這裏邊界由較小的值end_date@endDate和較大的值start_date@startDate劃定。

假設,您有以下記錄(只有一個)

start_date = 2016-09-01end_date=2016-09-05

而且@startDate=2016-09-02@endDate=2016-09-04

現在檢查上述條件將針對這組數據的失敗。

在這種情況下,你需要採取以下查詢:

SELECT 
* 
FROM your_table 
WHERE EXISTS (
    SELECT 
    user_id 
    FROM your_table 
    WHERE end_date >= @startDate 
    AND start_date <= @endDate 
    AND user_id = 1 
    GROUP BY user_id 
    HAVING SUM((DATEDIFF(LEAST(end_date,@endDate),GREATEST(start_date,@startDate))+1)) = DATEDIFF(@endDate,@startDate)+1 
) 
AND end_date >= @startDate 
AND start_date <= @endDate 
AND user_id = 1 
+0

這工作,並很容易理解,並在連接中使用。非常感謝。 –

+0

還有一個問題我如何比較查詢中的時間? –