SQL:基于条件的字段值?

时间:2012-07-18 17:54:56

标签: php mysql 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

什么是下降方式呢?

2 个答案:

答案 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

答案 1 :(得分: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列是字符数据类型,包含格式化为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会话时区中指定的那样。