确定日期范围内的天数

发布于 2025-02-03 03:18:06 字数 323 浏览 3 评论 0原文

我对Mysql和真诚的道歉是非常陌生的,因为他们努力为这个问题找到正确的方法。

我有一个包含事件时间表时间的表:

”在此处输入图像描述

Event_ID 1将在03-04-2022至03-12-2022的每个星期一在每个星期一运行在日期范围之间的每个event_id。

I am very much new to the mysql and sincere apologies as struggling to find the right approach for the question.

I have a table which is containing the events schedule time:

enter image description here

Event_id 1 will be running on every Monday in between 03-04-2022 to 03-12-2022.I need to find the total run count of the each Event_id in between a date range.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

陌若浮生 2025-02-10 03:18:06

您需要在开始日期和结束日期之间找到一天。
例如,event_id = 1的开始日期和结束日期之间有多少个星期一,依此类推。

在问题中,start_date和end_date的event_id = 4不正确,因为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 fiddle

递归查询示例来自在这里

样本输出

-Event_idDay_nos_as_run_count
135
223
32
40

查询的另一个变体 -

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

You need to find number of day between start and end date.
E.g. how many Monday between start and end date for event_id=1 and so on.

In the question start_date and end_date for event_id=4 are not correct as start_date > end_date.
Also, there is a spelling mistake in day name for evnet_id=4.

The query used for getting the result, after fixing data issues is -

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

Recursive query example help from here.

Sample output -

event_idday_nos_as_run_count
135
223
32
40

Another variant of the query -

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
独﹏钓一江月 2025-02-10 03:18:06

首先以日期格式存储日期:03-04-2022应以> 2022-04-03(假设您的格式是每天的年度)存储。并将其存储到声明为日期的列中,而不是varchar

然后,您可以使用netatediff()函数来获得差异。

Start by storing dates in date format: 03-04-2022 should be stored as 2022-04-03 (assuming that your format is day-month-year). And store into a column declared to be DATE, not VARCHAR.

Then you have the ability to use the DATEDIFF() function to get differences.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文