计算两个日期之间的特定星期几

时间:2013-08-27 08:04:49

标签: mysql sql

我需要计算两个日期之间的特定天数(例如周三和周四)。

我知道时间函数和所有相关函数,但我不知道如何在这种情况下使用它们。


问题解决了两个解决方案,但似乎我无法选择展位解决方案。 感谢您Andrius NaruševičiusKickstart的启发:D

3 个答案:

答案 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 )

完成。

Working SQL Fiddle

答案 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约束。