3

我需要返回一个特殊值来告诉我当前时间是否在营业时间内:

在餐桌

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

什么是下降的方式来解决这个问题?

4

2 回答 2

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
于 2012-07-18T17:56:52.923 回答
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”将等于关闭时间'16:00:00',所以在这种情况下,这真的取决于你是要返回 1 还是 0。

另请注意,NOW() 函数将在time_zone(MySQL) 会话的变量的当前设置中进行评估。(因此,该表中的 OPEN 和 CLOSE 时间正在被有效地评估,就好像它们是在 MySQL 会话时区中指定的一样。

于 2012-07-18T18:03:47.023 回答