簡體   English   中英

確定日期范圍內的天數

[英]Identify count of days in a date range

我對 mysql 非常陌生,並真誠地道歉,因為我正在努力為這個問題找到正確的方法。

我有一個包含事件安排時間的表:

在此處輸入圖像描述

Event_id 1 將在 2022 年 3 月 4 日至 2022 年 3 月 12 日之間的每個星期一運行。我需要找到一個日期范圍內每個 Event_id 的總運行次數。

您需要找到開始日期和結束日期之間的天數。 例如,在 event_id=1 的開始日期和結束日期之間有多少個星期一,依此類推。

在問題中,event_id=4 的 start_date 和 end_date 不正確,因為 start_date > end_date。 此外,evnet_id=4 的日期名稱存在拼寫錯誤。

修復數據問題后,用於獲取結果的查詢是 -

WITH RECURSIVE 
date_gen (gen_dt) AS
(
SELECT min(start_date) from event_tab
union all
SELECT date_add(gen_dt,interval 1 day) from date_gen where gen_dt < (select max(end_date) from event_tab)
)
SELECT 
e.event_id,
sum(case when dayname(d.gen_dt) =  e.schedule_day then 1 else 0 end ) day_nos_as_run_count
FROM date_gen d, event_tab e
where 
cast(d.gen_dt as date) between e.start_date and e.end_date
group by e.event_id

DB小提琴在這里

遞歸查詢示例幫助來自這里

樣本輸出 -

event_id day_nos_as_run_count
1 35
2 23
3 2
4 0

查詢的另一個變體 -

WITH RECURSIVE 
date_gen (gen_dt) AS
(
SELECT min(start_date) from event_tab
union all
SELECT date_add(gen_dt,interval 1 day) from date_gen where gen_dt < (select max(end_date) from event_tab)
)
SELECT 
e.event_id,
count(d.gen_dt)
FROM event_tab e left join date_gen d
on ( cast(d.gen_dt as date) between e.start_date and e.end_date
and e.schedule_day = dayname(d.gen_dt))
group by e.event_id
order by e.event_id

首先以日期格式存儲日期: 03-04-2022應存儲為2022-04-03 (假設您的格式為日-月-年)。 並存儲到聲明為DATE而不是VARCHAR的列中。

然后您就可以使用DATEDIFF()函數來獲取差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM