首页 > 解决方案 > 获取 24 小时时间范围内的记录

问题描述

我尝试根据小时和持续时间在我的表格中找到定价。例如,这是我的桌子

+----+-----------------+------------+----------+---------+
| id | subscription_id | start_time | end_time | pricing |
+----+-----------------+------------+----------+---------+
|  1 |               1 | 22:00:00   | 21:59:59 |     1.5 |
|  2 |               2 | 05:30:00   | 16:29:00 |    0.75 |
|  3 |               2 | 16:30:00   | 18:59:59 |    0.50 |
|  4 |               2 | 19:00:00   | 05:29:59 |     1.5 |
+----+-----------------+------------+----------+---------+

现在,我必须找到从 16:00:00 开始并在 20:00:00 结束的订阅 2 我尝试了几件事,但没有成功

SET @startTime := '17:30:00';
SET @endTime := '20:30:00';

SELECT *
FROM subscription_detail_pricing sdp
WHERE (
    (start_time < end_time AND TIME(@startTime) BETWEEN start_time AND end_time)
    OR
    (start_time > end_time AND TIME(@startTime) NOT BETWEEN end_time AND start_time)
    OR
    (start_time < end_time AND TIME(@endTime) BETWEEN start_time AND end_time) 
    OR
    (start_time > end_time AND TIME(@endTime) NOT BETWEEN end_time AND start_time)
) AND subscription_id = 2;

我没有找到获取与此范围相对应的 3 条记录的查询方法

如果有人可以提供一些提示,我会失去自己-_-

感谢阅读本娃

标签: mysql

解决方案


这看起来像一个经典的范围重叠查询..

如果可能的话,您可以省去头疼的问题,将包含的任何范围"00:00:00"分成两个单独的行,并使您end_time的 s 独占

+----+-----------------+------------+----------+---------+
| id | subscription_id | start_time | end_time | pricing |
+----+-----------------+------------+----------+---------+
|  1 |               1 | 00:00:00   | 24:00:00 |     1.5 |
|  2 |               2 | 00:00:00   | 05:30:00 |     1.5 |
|  3 |               2 | 05:30:00   | 16:30:00 |    0.75 |
|  4 |               2 | 16:30:00   | 19:00:00 |    0.50 |
|  5 |               2 | 19:00:00   | 24:00:00 |     1.5 |
+----+-----------------+------------+----------+---------+

然后你的查询就变得简单多了

SELECT *

  FROM subscription_detail_pricing

 WHERE start_time < "20:00:00"
   AND end_time > "16:00:00"

请注意,我更喜欢排他比较,<并且>,对于此查询,因为您要比较的内容

  • start_time < "20:00:00"- 将start_time(包括)与输入范围的结尾("20:00:00"不包括)进行比较
  • end_time > "16:00:00"- 将end_time(不包括)与输入范围的开始"16:00:00"(包括)进行比较

只要至少有一个被比较的值是独占的,检查相等性<=>=, 对我来说没有意义


推荐阅读