我將需要返回一個特殊值來告訴我,如果當前時間是營業時間內: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
這將是一個下降的路要走,這件事嗎?
我將需要返回一個特殊值來告訴我,如果當前時間是營業時間內: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
這將是一個下降的路要走,這件事嗎?
測試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
這將返回指定的結果集:
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
鑑於OPEN
和CLOSE
列是字符數據類型,包含格式化爲二十四小時制字符串。 (注意:使用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會話時區中指定的一樣)