我需要计算两个日期之间的特定天数(例如周三和周四)。
我知道时间函数和所有相关函数,但我不知道如何在这种情况下使用它们。
问题解决了两个解决方案,但似乎我无法选择展位解决方案。 感谢您Andrius Naruševičius和Kickstart的启发:D
答案 0 :(得分:1)
从here
采取和改编的方法@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 )
完成。
答案 1 :(得分:1)
使用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开始)并将它们添加到结果为&lt; =结束日期的开始日期。然后获取每个人的日期名称并计算每个人的名字。
答案 2 :(得分: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
这是code for a calendar table in PostgreSQL。你必须跳过一些箍来为MySQL翻译,因为MySQL没有强制执行CHECK约束。