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


    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

  • 相关阅读:
    python学习
    androidandroid中的通过网页链接打开本地app
    Android自定义View之绘制虚线
    Backbone学习记录(3)
    Backbone学习记录(2)
    Backbone学习记录(1)
    网络时间轴中竖线的含义
    控制台笔记
    css hack 笔记
    Fiddler学习笔记
  • 原文地址:https://www.cnblogs.com/molashaonian/p/16229892.html
Copyright © 2020-2023  润新知