获取日期之间的特定工作日数

时间:2019-12-10 19:35:12

标签: mysql

如何从日期范围中获取特定工作日的金额,而没有循环?

  • 开始日期= 2020-01-01
  • end_date = 2020-01-24
  • 工作日= 3(星期三)

获取这些日期之间的星期三量。

WEEKDAYS_COUNT(startdate, enddate, weekday)

如果日期范围的开始和结束日期相同,则该日期为星期三,则应输出1。

注意:这不是重复项。 除了排除周六和周日之外,没有人可以解决这个问题。

2 个答案:

答案 0 :(得分:0)

我要查询所有可能日期的calendar表。例如

CREATE TABLE cal (dt DATE NOT NULL, PRIMARY KEY (dt)) ;

填充了我们要检查的两个日期之间的所有日期,

INSERT INTO cal (dt) VALUES ('2019-01-01'),('2019-01-02'),('2019-01-03'),...

还有其他方法可以生成一组行,而无需调用静态的预构建日历表。我们只需要足够的行,以及在两个边界之间生成不同日期值的方法。其他数据库具有一些生成整数序列的巧妙方法。我们可以让MySQL通过一些凌乱的UNION ALL和CROSS JOIN操作生成有限的行负载

但是我们生成行时,方法是相同的:

有条件的聚合。我们可以得到两个边界之间的一组日期值。确定该日期是否被视为星期三,并分别返回1或0。将所有行折叠为单行,然后将1和0总计即可获得计数。

类似这样的东西:

SELECT SUM(IF(WEEKDAY(c.dt)+1 = 3 ,1,0)) AS cnt_wednesdays
  FROM cal c
 WHERE c.dt >= '2020-01-01' + INTERVAL 0 DAY
   AND c.dt  < '2020-01-24' + INTERVAL 0 DAY

注意:

MySQL WEEKDAY()函数0 =星期一,1 =星期二,... 6 =星期日

MySQL DAYOFWEEK()函数:1 =星期日,2 =星期一,... 7 =星期六

如果下边界日期和/或上限日期是星期三,是否应将其视为包含的“星期三”?

例如,考虑从1月2日星期三'2019-01-02'到1月9日星期三'2019-01-09'的范围;我们是否要返回“星期三”计数0、1或2?

适当调整比较运算符> / >=< / <=包含/排除的相等性,以包括/排除边界日期。

答案 1 :(得分:0)

根据MySQL中的日期范围计算特定工作日的数量(稍作更改即可在其他SQL引擎中使用)

取决于每个工作日的WEEKDAY编号:

0 = Monday, 1 = Tuesday, 2 = Wednesday, 3 = Thursday, 4 = Friday, 5 = Saturday, 6 = Sunday

如果要计算星期三,则应使用2作为条件:

select @wday:=WEEKDAY(start_date), @difday:=datediff(end_date, start_date), 
(CASE
    WHEN start_date > end_date THEN 0
    WHEN start_date = end_date THEN 1
    ELSE 
    CASE 
        WHEN @wday>2 THEN ( @difday div 7 ) + IF( (@difday mod 7) - (7-@wday)>=2,1,0 )
        WHEN @wday<2 THEN ( @difday div 7 ) + IF( (@difday mod 7) >= (2-@wday),1,0 )
        WHEN @wday=2 THEN ( @difday div 7 )
    END

END) as WEEKDAYS from table1