兩個時間段是否有交集 + 數據庫時間類型選擇問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章