Lavarel SQL中日期范围数据查询问题
问题分析与正确解法
嗨,咱们先拆解下你原来的SQL问题,再给出符合需求的正确写法:
你原来的SQL存在的问题
- BETWEEN参数顺序搞反了:BETWEEN的规则是第一个值必须≤第二个值,你写的
Start_date BETWEEN '2021-10-10' AND '2021-10-08'相当于要求日期同时≥2021-10-10且≤2021-10-08,这根本不可能有符合条件的数据。 - 语法错误:你的语句最后少了一个右括号,数据库执行时会直接报错。
- 逻辑和需求不匹配:你写的是找Start_date在某个区间或End_date在某个区间的记录,但这和“当前日期处于该记录的Start_date到End_date范围内”的需求完全不是一回事。
针对「当前日期处于Start_date至End_date区间内」的正确写法
如果你的需求是获取**当前日期落在某条记录的Start_date和End_date之间(包含边界)**的数据,直接用当前日期和两个字段比较就行:
方法1:用BETWEEN(适合纯日期类型字段)
SELECT * FROM text WHERE CURRENT_DATE BETWEEN Start_date AND End_date;
小提醒:如果你的Start_date/End_date是带时分秒的
datetime类型,CURRENT_DATE只返回日期部分,可能会漏掉End_date是当天但时间晚于00:00:00的记录,这种情况更推荐下面的写法。
方法2:用>=和<=(适配所有日期/时间类型,更稳妥)
SELECT * FROM text WHERE Start_date <= CURRENT_DATE AND End_date >= CURRENT_DATE;
注:CURRENT_DATE是大多数数据库通用的获取当前日期的函数,不同数据库可能有专属函数,比如MySQL用CURDATE(),SQL Server用GETDATE(),替换成对应函数即可。
如果是「记录的时间段与指定日期区间重叠」的需求
如果你实际是想找时间段(Start_date到End_date)和某个指定区间(比如你例子里的2021-10-08至2021-10-10)有重叠的记录,那判断重叠的标准逻辑是:
SELECT * FROM text WHERE Start_date <= '2021-10-10' AND End_date >= '2021-10-08';
这个逻辑能覆盖所有重叠场景:比如记录的时间段完全包含指定区间、部分重叠,甚至指定区间包含记录的时间段。
内容的提问来源于stack exchange,提问作者JDPinko
相关产品推荐
相关产品推荐

