2012-03-30 55 views
0

我有一個場景,我希望能夠從MySQL表中選擇行,但排除當前時間在一定時間範圍內的行。更正查詢優化時間範圍的MySQL結構?

示例: 一行的「安靜」期限爲晚上10點至上午8點30分。 如果當前服務器時間晚上10點或上午8點30分之前,我的SQL SELECT語句不應返回該行。

示例2:「安靜期」爲空並被忽略。

示例3:從上午9:53到上午9:55創建了一個安靜的時間段。如果當前服務器時間在2分鐘的窗口中,則該行不會被SELECT返回。

我的問題: 你會在數據庫中使用什麼數據格式,以及如何編寫查詢?

我想過幾種不同的方法(將start_time定義爲一列和另一個持續時間,以秒爲單位定義......或使用日期戳......或其他)。沒有一個看起來很理想,需要大量的計算。

謝謝!

+0

你只需要每行的時間或者你還需要日期嗎? – liquorvicar 2012-03-30 06:07:02

+0

我不需要返回。我只是試圖根據一天的時間進行過濾。我不在乎約會。與上面的示例一樣:我想排除當前服務器時間在指定的「安靜窗口」內的行。 – 2012-03-30 16:43:55

回答

2

我會將開始和結束日期存儲爲MySQL本地TIME字段。 你需要考慮跨越午夜作爲兩個單獨的範圍的範圍,但你將能夠查詢表像這樣,爲了找到目前所有的安靜期

SELECT DISTINCT name FROM `quiet_periods` 
WHERE start_time<=CURTIME() AND CURTIME()<=end_time 

還是要找到所有非活動的安靜期

SELECT name FROM quiet_periods WHERE name NOT IN (
    SELECT name FROM `quiet_periods` 
    WHERE start_time<=CURTIME() AND CURTIME()<=end_time 
) 
樣本數據

所以

id -- name  -- start_time -- end_time 
1 -- late_night -- 00:00:00 -- 08:30:00 
2 -- late_night -- 22:00:00 -- 23:59:59 
3 -- null_period -- NULL  -- NULL 
4 -- nearly_10am -- 09:53:00 -- 09:55:00 

在晚上11時將返回

null_period 
nearly_10am 

來自第二查詢。

根據性能和您有多少行可能需要將第二個查詢重構爲JOIN,並且可能還會添加相關的INDEX。

+0

做得很好!跨越午夜是我正在考慮的問題,我希望可以在不添加第二張桌子並加入JOIN的情況下完成,但是哦= P – 2012-03-31 18:12:18