sql 查詢時間 SQL查詢時間段重合的記錄

2021-10-18 00:00:35 字數 3302 閱讀 1639

問題:查詢某一列/物件時間段重合的記錄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<=b2b1<=a2<=b2,但同時排除期間首尾相連的情況,即 b1情況3:a與b相離,或相接。

情況3滿足 a2<=b1滿足 b2<=a1;非情況3,也可以作為時間段重合的判斷,即 a2>b1且 a1要查詢查詢時間段重合的記錄,必定是一組或多組,即輸出結果中應同時包含a或b,單個時間段是無所謂重合與否的。

實現方法:自連線inner join

**:

--方法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

從**可以看出,實際上用方法2或3會比方法1簡單得多。

測試資料及檢驗:

--建立示例表

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 ...