2012-07-18 119 views
3

我將需要返回一個特殊值來告訴我,如果當前時間是營業時間內:SQL:基於條件的字段值?

在表地方

ID OPEN  CLOSE 
1  14:00 16:00 
2  12:00 15:00 
3  10:00 14:00 

我需要查詢一個特殊的領域返回:PLACE_IS_OPEN - true或false。

,以便到時14:35是返回結果:

ID  PLACE_IS_OPEN 
1  1 
2  1 
3  0 

這將是一個下降的路要走,這件事嗎?

回答

5

測試TIME(NOW())位於打開和關閉時間之間並將其布爾結果作爲列返回。如果您的OPEN,CLOSE是MySQL DATETIME或TIME列,這將按原樣工作

SELECT 
    ID, 
    OPEN, 
    CLOSE, 
    CASE WHEN TIME(NOW()) BETWEEN `OPEN` AND `CLOSE` THEN 1 ELSE 0 END AS PLACE_IS_OPEN 
FROM yourtable 

如果這些字符列,而不是正確的TIME類型,則需要STR_TO_TIME()將它們轉換

CASE WHEN TIME(NOW()) BETWEEN TIME(STR_TO_DATE(`OPEN`, '%H:%i')) AND TIME(STR_TO_DATE(`CLOSE`, '%H:%i')) THEN 1 ELSE 0 END AS PLACE_IS_OPEN 

和MySQL應該讓你簡化CASE聲明瞭,因爲BETWEEN將返回0或1,因爲它是:

SELECT 
    ID, 
    OPEN, 
    CLOSE, 
    (TIME(NOW()) BETWEEN TIME(STR_TO_DATE(`OPEN`, '%H:%i')) AND TIME(STR_TO_DATE(`CLOSE`, '%H:%i'))) AS PLACE_IS_OPEN 
FROM yourtable 
2

這將返回指定的結果集:

SELECT t.ID 
    , CASE WHEN t.open <= DATE_FORMAT(NOW(),'%H:%i') 
      AND t.close > DATE_FORMAT(NOW(),'%H:%i') 
     THEN 1 ELSE 0 END AS PLACE_IS_OPEN 
    FROM places t 
ORDER BY t.ID 

鑑於OPENCLOSE列是字符數據類型,包含格式化爲二十四小時制字符串。 (注意:使用BETWEEN將在CLOSE的精確分鐘上給出錯誤的結果,DATE_FORMAT將修剪當前時間的秒部分,例如,'16:00:45'的時間將會被格式化爲'16:00',其可能等於指定的CLOSE,但實際上是由CLOSE指定的實際時間之後的45秒。)

您還需要確保您沒有任何行「跨越」午夜,例如開放時間從晚上10點到凌晨2點,其中CLOSE的值將會小於OPEN。 (爲了使這個查詢起作用,這樣的時間段將需要被表示爲表中的兩個單獨的行,從OPEN到'24:00'的一行,以及從'00:00'到CLOSE的另一行。)

請注意,午夜時間的CLOSE需要表示爲'24:00'。 (也就是說,24小時開放的地方可以表示爲OPEN ='00:00'和CLOSE = '24:00'。)

如果您的數據不符合這些規則(例如,接近被表示爲00:00或CLOSE小於OPEN,查詢將需要「改進」來處理這些情況。


如果你打開和合攏列數據類型TIME的(而不是字) ,查詢也需要修改,使用TIME()函數代替DATE_FORMAT()函數。(此外,在這種情況下,如果在當前時間與關閉時間完全匹配時允許返回值1,則可以使用BETWEEN:當前時間值'16:00:00'將等於CLOSE時間'16:00:00',所以它真的取決於你是否想返回1或0在這種情況下

還要注意NOW()函數將在當前設置的time_zone變量您的(MySQL)會話(因此,該表中的OPEN和CLOSE時間正在被有效地評估,就好像它們是在MySQL會話時區中指定的一樣)