2014-04-07 45 views
3

我有一個表:如何驗證用戶的日期輸入時的驗證標準存儲在SQL數據庫

| ID | Date-Start |Date-End| 
| 01 | 2014-04-10 |2014-04-12| 
| 02 | 2014-04-13 |2014-04-15| 
| 03 | 2014-04-16 |2014-04-18| 
| 04 | 2014-04-19 |2014-04-22| 

用戶選擇2個日期,我需要驗證這兩個日期不與跨越表中的人。 例如用戶輸入2014-04-20到2014-04-21,這是無效的,因爲在記錄04中,此範圍從2014-04-19到2014-04-22佔用。 Ty求助。對不起,我的英語不好。

+1

這可能會有所幫助:http://stackoverflow.com/questions/2545947/mysql-range-date-overlap-check –

+0

Ty David,非常helphulp :) – user3507250

回答

0
SELECT ID FROM table WHERE ((Date-Start >= '$first-date' AND Date-Start <= '$second-date') 
OR (Date-End >= '$first-date' AND Date-End <= '$second-date')) 

如果它返回一個結果,那麼這一段時間應該是無效的

+0

嗨gbestard,ty爲您的迴應,但選擇不要爲我工作,因爲如果我選擇這個日期:2014-04-20至2014-04-21,選擇不佔用這個範圍就像佔用,不返回任何東西,這應該是返回最後一個記錄(| 04 | 2014-04 -19 | 2014-04-22 |),ty – user3507250

+0

如果它沒有返回任何東西,那麼給定的時間段是可以的 – gbestard

0

所以,你可以做

(r1.dateEnd > r2.dateStart) and (r2.dateEnd > r1.dateStart) 

,看看行重疊。例如找到重疊的行

select * from DateTable r1, DateTable r2 
where (r1.dateEnd > r2.dateStart) and (r2.dateEnd > r1.dateStart) 

或找到重疊的日期與查詢:

select * from DateTable r1 
where (r1.dateEnd >= {start_date}) and ({end_date} >= r1.dateStart) 
+0

嗨克里斯基,對不起,但我是一個新的MySQL,我不明白這是如何工作,什麼是r1和r2 ?,我在哪裏提供的日期提供給用戶,ty – user3507250

+0

對不起,我可以更清楚。上面的例子在一個DateTabe中重疊條目 - 它的別名爲r1和r2。我編輯了答案。關鍵的是要有一個像我給出的比較 - 這涵蓋了所有重疊的情況,例如當一個跨度完全包含另一跨度時。如果您使用此處概述的其他類型的比較,則不會發現該情況。 – Chrisky

0

使用僞代碼:

SELECT COUNT(*) FROM `TABLE` WHERE `Date-Start` BETWEEN <start-date> AND <end-date> OR `Date-End` BETWEEN <start-date> AND <end-date> 

然後你就可以檢查是否計數> 0。如果是的,你知道日期已被佔用。

+0

您好Samsquanch,ty爲您的迴應,但選擇不爲我工作,因爲如果我選擇此日期:2014年4月20日至2014年4月4日,選擇不取這個範圍像佔用和返回0,這應該返回最後一條記錄(| 04 | 2014-04-19 | 2014-04-22 |),ty – user3507250