問題:查詢某一列/物件時間段重合的記錄time range overlap
資料結構:表demo_table,字段如下:
字段型別
id...
object_name/物件
varchar
start_time/開始時間
datetime
end_time/結束時間
datetime
others/其他字段
...思路:
假設有a時間段(期間為a1-a2),b時間段(期間為b1-b2),潛在條件a1情況1:a或b相交但不包含,也不相接;
情況2:a含於b,或b含於a,可以完全重合;
不管是情況1還是2,只要保證乙個時間段的起始點或終點落在另乙個時間段的期間即可,即 b1<=a1<=b2或b1<=a2<=b2,但同時排除期間首尾相連的情況,即 b1情況3:a與b相離,或相接。
情況3滿足 a2<=b1或滿足 b2<=a1;非情況3,也可以作為時間段重合的判斷,即 a2>b1且 a1要查詢查詢時間段重合的記錄,必定是一組或多組,即輸出結果中應同時包含a或b,單個時間段是無所謂重合與否的。
實現方法:自連線inner join
**:
從**可以看出,實際上用方法2或3會比方法1簡單得多。--方法1:情況2的判定條件
select distinct t1.* from demo_table t1
inner join demo_table t2
on t1.object_name=t2.object_name --以指定的列進行自連線
where
t1.id!=t2.id --去除自身重複的情況
and (
(t1.start_time >= t2.start_time and t1.start_time <= t2.end_time)
or (t1.end_time >= t2.start_time and t1.end_time <= t2.end_time)
or (t2.start_time > t1.start_time and t2.start_time < t1.end_time)
or (t2.end_time > t1.start_time and t2.end_time < t1.end_time)
) and not (
t1.start_time = t2.end_time or t2.start_time = t1.end_time
)--方法2:非情況3-直接表述判定條件
select distinct t1.* from demo_table t1
inner join demo_table t2
on t1.object_name=t2.object_name
where
t1.id!=t2.id
and not (t2.end_time <= t1.start_time)
and not (t1.end_time <= t2.start_time)
--方法3:非情況3-間接表述判定條件
select distinct t1.* from demo_table t1
inner join demo_table t2
on t1.object_name=t2.object_name
where
t1.id!=t2.id
and t2.end_time > t1.start_time
and t1.end_time > t2.start_time
測試資料及檢驗:
生成的示例表如下所示:--建立示例表
create table demo_table (
id int primary key
,object_name varchar(10) not null
,start_time datetime not null
,end_time datetime not null
,duration_hours varchar(10)
)--插入資料
insert into demo_table values(1,'a','2020/12/31 08:00:00','2020/12/31 16:00:00',8)
insert into demo_table values(2,'a','2020/12/31 09:00:00','2020/12/31 14:00:00',5)
insert into demo_table values(3,'a','2020/12/31 10:00:00','2020/12/31 15:00:00',5)
insert into demo_table values(4,'b','2020/12/31 16:00:00','2020/12/31 18:00:00',2)
insert into demo_table values(5,'b','2020/12/31 19:00:00','2020/12/31 20:00:00',1)
insert into demo_table values(6,'c','2020/12/31 20:00:00','2020/12/31 20:00:00',0)
insert into demo_table values(7,'d','2020/12/31 13:00:00','2020/12/31 16:00:00',3)
insert into demo_table values(8,'d','2020/12/31 13:00:00','2020/12/31 16:00:00',3)
insert into demo_table values(9,'e','2020/12/31 21:00:00','2020/12/31 22:00:00',1)
insert into demo_table values(10,'e','2020/12/31 22:00:00','2020/12/31 23:00:00',1)
預期得到的結果應如圖所示:
sql查詢時間段區間統計
寫好這個sql,竟然發現不知道現在是上午還是下午。看來我真是埋頭寫了乙個多小時沒有分散注意力了。呵呵。寫在部落格記錄一下!需求 按天統計巡檢的基站數量。建表sql create table plan vp stat patrol detail tid varchar2 40 not null,pat...
JAVA MONGODB 查詢時間段
雖然mongodb存的時間為utc時間,與中國相差8小時,但是這並不需要客戶端程式做處理。dateformat format new dateformat yyyy mm dd hh mm ss date starttime format.parse 2019 06 17 15 37 08 date...
mysql查詢時間段
閱讀需要 3 分鐘 內容 mysql 時間段查詢 一些時間的型別 及常用時間函式 日期型別 儲存空間 日期格式 日期範圍 datetime 8 bytes yyyy mm dd hh mm ss 1000 01 01 00 00 00 9999 12 31 23 59 59 timestamp 4 ...