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