我需要返回一个特殊值来告诉我当前时间是否在开放时间内:
表地方
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
什么是下降方式呢?
答案 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
假设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会话时区中指定的那样。