【问题标题】:MySQL: Get record where TIME('xx:yy:zz') between start and end timeMySQL:获取开始和结束时间之间的 TIME('xx:yy:zz') 记录
【发布时间】:2016-11-20 12:36:19
【问题描述】:

这是桌子:

+----+-----------+------------+----------+
| id | id_sensor | start_time | end_time |
+----+-----------+------------+----------+
|  1 |        12 | 21:15:00   | 02:45:00 |
|  2 |         7 | 00:00:00   | 23:15:00 |
|  3 |         5 | 04:30:00   | 16:30:00 |
+----+-----------+------------+----------+

我需要获取 PHP 通过的特定时间(例如 01:00:00)之间的记录。 start_time 和 end_time 是 UTC 中的 TIME 字段,我通过 php 传递到查询时间,注意,在 php 中从 user_timezone 转换为 UTC。

SELECT * FROM test WHERE TIME('01:00:00') BETWEEN start_time AND end_time;

查询只返回记录 id 2,而不是 1。在这种情况下,我需要两者(对于 id 1,结束时间当然是第二天)。

当然,如果我们查找 TIME('01:00:00'),我们不需要需要 id 3。

谢谢。

【问题讨论】:

  • 那么确定范围包含这一天的逻辑是什么?因为如果您还没有日期字段,那么每个开始时间/结束时间对都会以一种或另一种方式匹配您的查询:D
  • @Johhny 这是我的预期行为。但是,如果你尝试我的 SQL,它不会得到 id 1....
  • 你不懂我的评论。用您不希望返回的行来扩展您的问题。
  • @Johnny 刚刚完成!
  • 现在我明白了你的问题,是的,我会接受建议的答案!

标签: php mysql


【解决方案1】:

我认为这是你想要的逻辑:

SELECT *
FROM test
WHERE (start_time < end_time AND TIME('01:00:00') BETWEEN start_time AND end_time) OR
      (start_time > end_time AND TIME('01:00:00') NOT BETWEEN end_time AND start_time);

【讨论】:

  • 当然可以!我不明白为什么在 id 1 的情况下 NOT BETWEEN 有效...但是谢谢
  • 这很好,但它会给你带来误报,实际上它会匹配你所有开始>结束的记录。如果start_time &gt; end_time NOT BETWEEN start_time AND end_time 始终为真,则应为NOT BETWEEN end_time AND start_time,将时间倒转。
  • 查询TIME("05:00:00")会匹配3条记录,但应该只有1和3
  • 戈登编辑你的答案,我会接受。谢谢你再次@phobia82
【解决方案2】:

now() 返回当前时间和日期。您还可以使用 curtime(),它只返回当前时间。

顺便说一句,我认为应该避免使用 SELECT *(也许你只是在这个例子中使用它),恕我直言,明确列出所需的字段总是更好的。

【讨论】:

  • 我不/不能使用 NOW()。感谢您的 SELECT *,我知道,这只是一个测试...谢谢
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多