AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76930843
Accepted
imvain2
imvain2
Asked: 2023-08-18 23:48:04 +0800 CST2023-08-18 23:48:04 +0800 CST 2023-08-18 23:48:04 +0800 CST

mySQL 时间范围之间 - 开始时间可以大于结束时间

  • 772

我尝试搜索这个问题,但找不到任何与 mySQL 相关的内容。

我有一个包含各种数据的表,但对于这个问题,相关数据是星期几、开始时间和结束时间。

我正在尝试获取与一周中某一天匹配的记录,其中 now() 在匹配时间范围内。然而,问题是开始时间可以大于结束时间,反之亦然,或者时间也可能只是 00:00:00。

表的相关字段和示例数据page_data:

field_value | start_time | end_time
------------+------------+---------
Monday      | 17:00:00   | 08:00:00
Tuesday     | 17:00:00   | 08:00:00
Wednesday   | 17:00:00   | 08:00:00
Thursday    | 17:00:00   | 08:00:00
Friday      | 17:00:00   | 08:00:00
Saturday    | 00:00:00   | 00:00:00
Sunday      | 00:00:00   | 00:00:00

一些注意事项:

  • 00:00:00 - 00:00:00 基本上意味着全天跑步
  • 如果开始时间大于结束时间,例如 17:00 - 8:00,则意味着从下午 5 点运行到第二天早上 8 点。

我尝试过now() between start_time and end_time,但这不包括 start_time > end_time。

以下是我到目前为止所拥有的,但它在不应该返回时返回。

10:00:00 是一个测试时间,不应该返回任何内容,但它确实返回了。

为了测试我对时间进行硬编码而不是使用now()

如果我删除or ('10:00:00' between end_time and start_time)那么 start_time 更大将不会返回任何内容。

select * from page_data
where field_value = 'Friday'
and (
    (start_time = '00:00:00' and end_time = '00:00:00') or
    ('10:00:00' between start_time and end_time) or
    ('10:00:00' between end_time and start_time)
)

我对可以用来考虑这些考虑因素的查询感到困惑:

  • 开始时间 > 结束时间
  • 结束时间 > 开始时间
  • 结束时间 && 开始时间 = 00:00:00

谢谢

mysql
  • 2 2 个回答
  • 29 Views

2 个回答

  • Voted
  1. Best Answer
    Rob Eyre
    2023-08-19T00:37:23+08:002023-08-19T00:37:23+08:00

    在 start_time > end_time 的情况下,我猜您只想匹配 test_time 大于 start_time 或小于 end_time 的情况。这在逻辑上相当于 test_time NOT 在 end_time 和 start_time 之间。

    如果这个逻辑是正确的,那么这段代码可能就是您所需要的:

    select * from page_data
    where field_value = 'Friday'
    and (
        (start_time = '00:00:00' and end_time = '00:00:00') or
        (start_time < end_time) and ('10:00:00' between start_time and end_time) or
        (start_time > end_time) and NOT('10:00:00' between end_time and start_time)
    )
    
    • 1
  2. pilcrow
    2023-08-19T00:47:55+08:002023-08-19T00:47:55+08:00

    你会更喜欢这个吗?

    SELECT ...
      FROM easier_to_work_with
     WHERE day_of_week = DAYNAME(CURRENT_DATE)
           AND
           CURRENT_TIME BETWEEN start_time AND end_time;
    

    在我看来,使用指定为仅限于一天的时间间隔的“通知窗口”周期会更容易,将跨度超过一天的窗口表示为两个相邻窗口。

    然后您只需对照窗口检查当前日期和当前时间即可。

    您可以在不更改现有应用程序逻辑或现有表结构的情况下执行此操作:

    CREATE VIEW easier_to_work_with AS
         -- get same day windows
         SELECT ..., field_value as day_of_week, start_time, end_time
           FROM page_data
          WHERE start_time < end_time
          UNION
         -- get all day windows, or partials crossing midnight
         SELECT ..., field_value, start_time, '23:59:59'
           FROM page_data
          WHERE (start_time = '00:00:00' AND end_time = '00:00:00')
                  OR
                end_time < start_time
          UNION
         -- get carryover windows from the previous day
         SELECT ...,
                CASE field_value
                  WHEN 'Monday'    THEN 'Tuesday'
                  WHEN 'Tuesday'   THEN 'Wednesday'
                  WHEN 'Wednesday' THEN 'Thursday'
                  WHEN 'Thursday'  THEN 'Friday'
                  WHEN 'Friday'    THEN 'Saturday'
                  WHEN 'Saturday'  THEN 'Sunday'
                  WHEN 'Sunday'    THEN 'Monday'
                END, '00:00:00', end_time
           FROM page_data
          WHERE end_time < start_time;
    
    • 0

相关问题

  • MySQL:获取连续记录的数量(日期)?

  • Wordpress - 媒体库 - SQL 语法

  • docker-compose:无法将应用程序服务连接到 mysql 数据库,收到“错误:用户‘root’@‘localhost’访问被拒绝(使用密码:YES)

  • MySQL 运行自动脚本

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve