[英]SQL: field value based on condition?
我需要返回一個特殊值來告訴我當前時間是否在開放時間內:
在表的地方
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列OPEN,CLOSE
這將按原樣工作。
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
列是字符數據類型,包含格式化為24小時制的字符串。
(注意:使用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,則需要“改進”查詢以處理這些條件。
如果您的OPEN和CLOSE列的數據類型為TIME(而不是字符),則還需要使用TIME()
函數代替DATE_FORMAT()
函數來修改查詢。 (另外,在這種情況下,你可以使用BETWEEN,如果允許在當前時間與關閉時間完全匹配時返回值1:當前時間值'16:00:00'將等於CLOSE時間'16:00:00',所以這取決於你是想在這種情況下返回1還是0。
另請注意,NOW()函數將在(MySQL)會話的time_zone
變量的當前設置中進行評估。 (因此,該表中的OPEN和CLOSE時間被有效地評估,就好像它們是在MySQL會話時區中指定的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.