我需要计算两个日期之间的特殊天数(例如星期三和星期四)。
我知道时间函数和所有相关函数,但我不知道如何在这种情况下使用它们。
问题通过两种解决方案解决,但似乎我无法选择展位解决方案。感谢Andrius Naruševičius和Kickstart的启发:D
我需要计算两个日期之间的特殊天数(例如星期三和星期四)。
我知道时间函数和所有相关函数,但我不知道如何在这种情况下使用它们。
问题通过两种解决方案解决,但似乎我无法选择展位解决方案。感谢Andrius Naruševičius和Kickstart的启发:D
从这里采取和改编的方法
@S = start date
@E = end date, not inclusive
@full_weeks = floor( ( @E-@S ) / 7)
@days = (@E-@S) - @full_weeks*7 OR (@E-@S) % 7
SELECT
@full_weeks*1 -- saturday
+IF( @days >= 1 AND weekday( S+0 )=5, 1, 0 )
+IF( @days >= 2 AND weekday( S+1 )=5, 1, 0 )
+IF( @days >= 3 AND weekday( S+2 )=5, 1, 0 )
+IF( @days >= 4 AND weekday( S+3 )=5, 1, 0 )
+IF( @days >= 5 AND weekday( S+4 )=5, 1, 0 )
+IF( @days >= 6 AND weekday( S+5 )=5, 1, 0 )
完毕。
使用 SELECT 语句的另一种方法:-
SELECT DAYNAME(DATE_ADD(@StartDate, INTERVAL (Units.i + Tens.i * 10 + Hundreds.i * 100) DAY)) AS aDayOfWeek, COUNT(*)
FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS Units
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS Tens
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS Hundreds
WHERE DATE_ADD(@StartDate, INTERVAL (Units.i + Tens.i * 10 + Hundreds.i * 100) DAY) <= @EndDate
GROUP BY aDayOfWeek
这将适用于相隔最多 1000 天的日期,但很容易将其扩展为更大的日期范围。
它正在做的是生成一系列数字(从 0 开始)并将它们添加到开始日期,结果 <= 到结束日期。然后获取每个人的日期名称并计算每个人的数量。
我认为使用日历表更容易。例如,要找出 2013 年 3 月有多少个星期三和星期四,您可以这样做。
select count(*)
from calendar
where cal_date between '2013-03-01' and '2013-03-31'
and day_of_week in ('Wed', 'Thu')
count
--
8
要将其扩展到周日,只需在 IN 子句中添加“Sun”即可。(虽然我不得不说这让我觉得很奇怪。)
select count(*)
from calendar
where cal_date between '2013-03-01' and '2013-03-31'
and day_of_week in ('Wed', 'Thu', 'Sun')
count
--
13
这是PostgreSQL 中日历表的代码。您必须跳过一些障碍才能为 MySQL 翻译它,因为 MySQL 不强制执行 CHECK 约束。