環境:
假設我現在有一張表,有兩個欄位:name,create_time
然后我現在有一臺攝像頭,當有人從攝像頭下走過時表中就會根據當天時間插入一條資料
需求:
給定一個時間段,如:2019-02-01到2019-02-07
有沒有辦法直接一條SQL就查詢出這個時間段每天都出現的人呢?
uj5u.com熱心網友回復:
我腦瓜子都想爛了......uj5u.com熱心網友回復:
沒有你的資料,沒有測驗,不知道這樣行不行。SET @begin := '2019-02-01' ;
SET @end := '2019-02-07' ;
SELECT t.name FROM table1 t WHERE DATE_FORMAT(t.create_time,'%Y-%m-%d') BETWEEN DATE_FORMAT(@begin,'%Y-%m-%d') AND DATE_FORMAT(@end,'%Y-%m-%d')
GROUP BY t.name,DATE_FORMAT(t.create_time,'%Y-%m-%d') HAVING COUNT(0) = DATEDIFF(@end,@begin) + 1 ;
uj5u.com熱心網友回復:
好像不行
uj5u.com熱心網友回復:

資料差不多是這樣的,紅色方框里的就是我上面說的那兩個欄位,比如說我現在想要'2018-10-13 00:00:00'到'2018-10-15 23:00:00' 應該怎么寫呢。。。我快崩潰了??
uj5u.com熱心網友回復:
我按照你說的是這么寫的:
SELECT
p.NAME,
t.photo AS cardImage,
tba.location,
tba.pass_time,
tba.full_image
FROM
pedestrian tba
JOIN person_basic_info p ON p.face_id = tba.face_id
JOIN person_card_feature t on t.id=p.id
where tba.pass_time BETWEEN '2018-10-13 00:00:00' AND '2018-10-15 23:00:00'
AND tba.location ='1'
group by p.name,tba.pass_time HAVING COUNT(0) = DATEDIFF('2018-10-13 00:00:00', '2018-10-15 23:00:00') + 1 ;
uj5u.com熱心網友回復:
額,還要關聯其他的表啊。說說您修改以后,哪不行吧。
或者把執行結果發出來也行。
您說不行的sql的查詢結果。
uj5u.com熱心網友回復:
我弄出來了,group by去掉時間就可以了,但是這個SQL還是有問題。。因為需求必須是每天都出現,可是這個SQL只要同一天出現兩次,第二天不出來一樣可以。。
uj5u.com熱心網友回復:
試試這個SET @begin := '2019-02-01' ;
SET @end := '2019-02-07' ;
SELECT t.name FROM table1 t WHERE DATE_FORMAT(t.create_time,'%Y-%m-%d') BETWEEN DATE_FORMAT(@begin,'%Y-%m-%d') AND DATE_FORMAT(@end,'%Y-%m-%d')
GROUP BY t.name,DATE_FORMAT(t.create_time,'%Y-%m-%d') HAVING COUNT(DISTINCT DATE_FORMAT(t.create_time,'%Y-%m-%d')) = DATEDIFF(@end,@begin) + 1 ;
uj5u.com熱心網友回復:
那如果有時分秒呢...
uj5u.com熱心網友回復:
我好像大概知道了,我先試試我的想法行不行
uj5u.com熱心網友回復:
經過我的測驗,還是有一個問題。。
我用的是這個SQL去測驗的:
SELECT
p.NAME,
t.photo AS cardImage,
tba.location,
tba.pass_time,
tba.full_image
FROM
pedestrian tba
JOIN person_basic_info p ON p.face_id = tba.face_id
JOIN person_card_feature t on t.id=p.id
where tba.pass_time BETWEEN '2018-10-13 00:00:00' AND '2018-10-15 23:00:00'
AND tba.location ='1'
HAVING COUNT(DISTINCT DATE_FORMAT(tba.pass_time,'%Y-%m-%d')) = DATEDIFF('2018-10-15 23:00:00','2018-10-13 00:00:00') + 1 ;
然后資料是這樣的:

只顯示一條資料了,我想讓符合條件的資料都顯示,請問有辦法么。。
uj5u.com熱心網友回復:
加上時分秒,就是這樣的。你先看看這個執行結果是不是你需要查詢到的那些人,然后再把這個結果作為子表,關聯其它的表。SET @begin := '2019-02-01 01:02:03' ;
SET @end := '2019-02-07 03:02:01' ;
SELECT t.face_id FROM table1 t WHERE DATE_FORMAT(t.create_time,'%Y-%m-%d %H:%i:%s') BETWEEN DATE_FORMAT(@begin,'%Y-%m-%d %H:%i:%s') AND DATE_FORMAT(@end,'%Y-%m-%d %H:%i:%s')
GROUP BY t.face_id,DATE_FORMAT(t.create_time,'%Y-%m-%d') HAVING COUNT(DISTINCT DATE_FORMAT(t.create_time,'%Y-%m-%d')) = DATEDIFF(@end,@begin) + 1 ;
uj5u.com熱心網友回復:
select * from (select count(name) as count ,namefrom (
select distinct username,date(create_time ) as date from table where create_time BETWEEN '2018-02-01' and '2019-02-08'
)a GROUP BY name
)a where count=7
這樣就可以查出來了,如果資料量很大的話,就用Max函式去除每天的重復。我這是用的是distinct 簡單行事。
uj5u.com熱心網友回復:
select * from (select count(name) as count ,namefrom (
select distinct username,date(create_time ) as date from table where create_time BETWEEN '2019-02-01' and '2019-02-08'
)a GROUP BY name
)a where count=7
這樣就可以查出來了,如果資料量很大的話,就用Max函式去除每天的重復。我這是用的是distinct 簡單行事。
(寫錯時間了,修改一下)
uj5u.com熱心網友回復:
oracle有個開窗的函式陳述句 可以解決你的問題parition關鍵字uj5u.com熱心網友回復:
windows function. Lead / lag.轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/65356.html
標籤:MySQL
上一篇:求助大佬SQL代碼
下一篇:新人,求解pgsql中遇到的問題
