两个时间段是否有交集 + 数据库时间类型选择问题

本文介绍如何判断两个时间段是否存在交集,并讨论了在仅需时分的情况下,选择数据库时间类型的策略。推荐使用varchar类型存储时间数据,因为它在客户端时间格式转换过程中具有优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.判断两个时间段是否有交集

时间段交集图解

两个时间段:[start,end],[startTime,endTime]

存在交集的情况比较多,但是不存在交集的情况只有两种,所以只要排除了不存在交集的情况,剩下的就是存在交集的情况了。

不存在交集判断
end < startTime || start > endTime
因此,存在交集判断
if (!(end < startTime || start > endTime)) {
	//存在交集
}

2.数据库时间类型选择问题

背景:时间只需要 时分(HH:mm)

前面说到两时间段是否有交集判断,一般地,使用场景就是外部时间段与数据库时间段进行比较。
所以就会涉及到数据库时间段类型选择问题。
time or varchar
time 类型只保存 时分秒(HH:mm:ss),使用这个类型就要对入库的时间先进行拼凑:HH:mm + :ss

time,varchar 的优缺点比对

time

  • 优点:time可以借用sql函数库中运算函数,增加了时间在各种运算上的效率
  • 缺点:出库入库都要进行时间格式转换

varchar

  • 优点:varchar类型则可以在字符编码上显出优势,客户端的时间格式不再影响转换过程,在存储的时间将来不需要进行大量计算的前提下,可以考虑选择varchar类型
  • 缺点:不宜进行时间运算

这里只涉及时间的查询,比较,所以选择 varchar 类型更合适

Java判断两个时间段是否有交集
if(!(req.getEndTime().compareTo(item.getStartTime()) < 0 || req.getStartTime().compareTo(item.getEndTime()) > 0)) {
	throw new BusinessException(QcMessageCode.BAD_REQUEST, "已存在相同的时间段");
}
  • 这里的时间用 varchar(5) 类型存储(HH:mm),所以比较大小用 compareTo
  • 字符串之间的比较大小会转换为asc码从左到右一个个比对

即参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,返回该不同的字符的 asc码 差值,如果两个字符串不一样长,可以参与比较的字符又完全一样,则返回两个字符串的长度差值

  • 像这种字符串比较会比时间类型比较快得多,因为不需要转换计算

reference:

java简单的字符串大小比较——compareTo()方法
SQL判断两个时间段是否有交集
数据库中存储日期的字段类型到底应该用varchar还是datetime

关注公众号,分享干货,讨论技术

molashaonian

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值