NutzCN Logo
问答 问个MySQL时间段是否有交集的问题
发布于 2184天前 作者 steve7688 1810 次浏览 复制 上一个帖子 下一个帖子
标签:

小弟最近在做一个类似电影票定位的系统,有一个查询是查询客户选择的开始时间和时长(注意不是结束时间)
现在想查询两个时间段相交的记录,在CSDN查到了这篇文章https://blog.csdn.net/a312024054/article/details/76786739,用的第二种方式,伪SQL语句如下:

SELECT * FROM xxx WHERE NOT ((endTime < begin) OR (startTime > end));

数据库的字段 start_time, end_time

输入的字段 a,b

我的表字段
START_TIME——开始时间
DURATION——时长
跟他的情况略有不同:
1.我的START_TIME是varchar类型
2.我没有endTime,而是DURATION(int类型)

所以我是拿开始时间 + 时长得到结束时间的

于是我的SQL语句如下:

SELECT START_TIME,DURATION FROM BT_ORDER  WHERE NOT 
(
	(date_add(str_to_date(START_TIME, '%H:%i'),interval DURATION minute) < str_to_date('18:00', '%H:%i')) 
    
    or 
    
    (str_to_date(START_TIME, '%H:%i') > date_add(str_to_date('18:00', '%H:%i'),interval 60 minute))
)

ORDER BY START_TIME ASC;

但是这样,查询出了三条记录:

START_TIME,DURATION
'17:00','60'
'18:00','60'
'19:00','105'

其中第一条和第三条不应该出现呀????

10 回复

入参是18:00、60

意思是从18:00开始,总共使用60分钟。

从查询结果来看,MySQL是把等于的情况也返回了。可是我并没有写等于。请问怎么修改这条SQL

譬如,第一条的逻辑上的 endTime 就是 18:00 吧

来自炫酷的 NutzCN

是的 但是18:00跟18:00比大小不应该返回0吗?我都已经转换了时间格式

个人建议直接存数值, seconds of date, 你现在这sql,数据量稍微大一点就gg了

wendal你意思是改成TIME类型吗?还是TIMESTAMP?

两个字段,一个存日期,一个存当天的秒数,不过,单个timestamp也ok了

日期的字段有的。但是在这条SQL里主要是根据时间来筛选,日期是大前提,其实还有个where条件我没写出来,那就是where date='xxxx-xx-xx'。

意思是我的日期字段跟时间字段是分开的,大神你的意思是合并成一个字段,这个字段改成TIMESTAMP类型?

是不要存 18:00 这样的值,更要避免使用数据库函数,where条件里面

好的 get到你的意思了,多谢

添加回复
请先登陆
回到顶部