【问题标题】:Get number of specific weekdays between dates获取日期之间的特定工作日数
【发布时间】:2019-12-10 19:35:12
【问题描述】:

如何在不循环的情况下从日期范围中获取特定工作日的数量?

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

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

WEEKDAYS_COUNT(startdate, enddate, weekday)

如果日期范围有相同的开始和结束日期,如果这个日期是星期三,它应该输出 1。

注意:这不是重复的。 除了周六和周日之外,没有人知道这个问题的有效公式。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我会查询所有可能日期的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 的“星期三”计数吗?

    根据需要调整比较运算符 &gt; / &gt;=&lt; / &lt;= 中包含/排除的相等性以包含/排除边界日期。

    【讨论】:

      【解决方案2】:

      根据 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-23
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        相关资源
        最近更新 更多