簡體   English   中英

SQL:基於條件的字段值?

[英]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

假設OPENCLOSE列是字符數據類型,包含格式化為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM