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

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

posted on 2022-05-06 18:09  EvanLong  阅读(299)  评论(0编辑  收藏  举报

导航