0

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

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


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

4

3 回答 3

1

从这里采取和改编的方法

@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 )

完毕。

工作 SQL 小提琴

于 2013-08-27T08:28:43.800 回答
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 开始)并将它们添加到开始日期,结果 <= 到结束日期。然后获取每个人的日期名称并计算每个人的数量。

于 2013-08-27T10:44:42.857 回答
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 约束。

于 2013-08-27T12:04:24.117 回答