如何使用SQL知道一个月中剩余的星期一,星期二,星期三,...和星期日的数量?

阿图罗·雷耶斯(Arturo Reyes)

我想更新具有日期列的行的值,并且想要生成该月中RemainingMondays,RemainingTuesdays等的列值。例如,如果我有2019-03-20(2019年3月20日),则需要使用下一个列值更新该行。RemainingMondays-> 2,RemainingTuesdays-> 1,RemainingWednesdays-> 1,RemainingThursdays-> 2,RemainingFridays-> 2,RemainingSaturdays-> 2,RemainingSundays-> 2,(如您所见)我不想计算工作日在那一天(这意味着在该月的最后一天,所有列的值都将为0)。如何在SQL中执行此操作?

迈克尔·穆林

我使用MySQL测试了该解决方案,但是它可以在任何SQL引擎中使用。

测试数据:

CREATE TABLE test_date (
  date date NOT NULL
);

INSERT INTO test_date VALUES
('2019-03-01'),
('2019-03-20'),
('2019-03-21'),
('2019-03-22'),
('2019-03-23'),
('2019-03-24'),
('2019-03-25'),
('2019-03-26');

查询以获取您的数据:

SELECT 
    td2.date,
    /* 
    To calculate remaining of a weekday, you can then use this formula:

    if desired_week_day_number > week_day_number
       and desired_week_day_number <= (week_day_number + remaining_days_after_weeks):
        remaining_weeks + 1
    elseif desired_week_day_number <= (week_day_number + remaining_days_after_weeks - 7):
        remaining_weeks + 1
    else remaining_weeks
    */
    CASE WHEN (1 > td2.week_day_number AND 1 <= (td2.week_day_number + td2.remaining_days_after_weeks))
              OR 1 <= (td2.week_day_number + td2.remaining_days_after_weeks - 7)
         THEN td2.remaining_weeks + 1
         ELSE td2.remaining_weeks
    END remaining_sundays,
    CASE WHEN (2 > td2.week_day_number AND 2 <= (td2.week_day_number + td2.remaining_days_after_weeks))
              OR 2 <= (td2.week_day_number + td2.remaining_days_after_weeks - 7)
         THEN td2.remaining_weeks + 1
         ELSE td2.remaining_weeks
    END remaining_mondays,
    CASE WHEN (3 > td2.week_day_number AND 3 <= (td2.week_day_number + td2.remaining_days_after_weeks))
              OR 3 <= (td2.week_day_number + td2.remaining_days_after_weeks - 7)
         THEN td2.remaining_weeks + 1
         ELSE td2.remaining_weeks
    END remaining_tuesdays,
    CASE WHEN (4 > td2.week_day_number AND 4 <= (td2.week_day_number + td2.remaining_days_after_weeks))
              OR 4 <= (td2.week_day_number + td2.remaining_days_after_weeks - 7)
         THEN td2.remaining_weeks + 1
         ELSE td2.remaining_weeks
    END remaining_wednesdays,
    CASE WHEN (5 > td2.week_day_number AND 5 <= (td2.week_day_number + td2.remaining_days_after_weeks))
              OR 5 <= (td2.week_day_number + td2.remaining_days_after_weeks - 7)
         THEN td2.remaining_weeks + 1
         ELSE td2.remaining_weeks
    END remaining_thursdays, 
    CASE WHEN (6 > td2.week_day_number AND 6 <= (td2.week_day_number + td2.remaining_days_after_weeks))
              OR 6 <= (td2.week_day_number + td2.remaining_days_after_weeks - 7)
         THEN td2.remaining_weeks + 1
         ELSE td2.remaining_weeks
    END remaining_fridays,
    CASE WHEN (7 > td2.week_day_number AND 7 <= (td2.week_day_number + td2.remaining_days_after_weeks))
              OR 7 <= (td2.week_day_number + td2.remaining_days_after_weeks - 7)
         THEN td2.remaining_weeks + 1
         ELSE td2.remaining_weeks
    END remaining_saturdays,
    td2.*
FROM (
    SELECT
        td.date,
        day(td.date) day_number,
        dayofweek(td.date) week_day_number,
        dayname(td.date) week_day_name,
        day(last_day(td.date)) nb_month_days,
        day(last_day(td.date)) - day(td.date) remaining_days,
        floor((day(last_day(td.date)) - day(td.date)) / 7) remaining_weeks,
        day(last_day(td.date)) - day(td.date) -
            floor((day(last_day(td.date)) - day(td.date)) / 7) * 7 remaining_days_after_weeks
    FROM test_date td
) AS td2
ORDER BY td2.date;

您可以将完全相同的内容插入更新语句中。

如果您将工作日放在子查询/子表中,当然可以使其更短/更简单,从而避免在一周的每一天重复该公式,但是我现在将此练习交给您。;-)的工作主要是弄清楚如何计算给定工作日的剩余时间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何知道今天是本月的哪个星期一,星期二,星期三等(数量)?

确定一个月中非星期日的数量

JSON数据-使用Javascript / Jquery按星期几(星期日,星期一,星期二,星期三,星期四,星期五,星期六)分组

通过删除星期六和星期日只取一个月中的几天

在一个月的第三个星期日之前找到星期一

使用python,我如何从星期三而不是星期日或星期一开始我的几周?

如何获取两个日期之间的所有星期日/星期一/星期二?

如何计算一个月中的星期日并选择第三个?

突出显示一个月中的所有星期日

计算两个日期之间的周末(星期六和星期日)的数量

SQL设置从星期一到星期日每个月的星期数

如何获得一个月中的所有星期一?

如何找到一个月的最后一个星期三之后的星期五?

SQL DATEPART(dw,date)需要星期一= 1和星期日= 7

如何获取最近4周的星期一和星期日的日期在php中?

使用 NSCalendar Swift 查找星期日和星期一

如何选择已过月份的第一个星期一之前的星期日

对Bootstrap-Vue表进行排序(星期一,星期二,星期三而不是字母顺序)

按工作日(例如星期一,星期二,星期三...)对计划顺序排序

Unix时间戳和新西兰时区中上周的星期一和星期日

如何根据一个月中的星期将日期截断为星期五?

如何使用java获得一个月的第一个星期日

根据给定的日期范围获取星期一和星期日

MySQL日期介于上个星期一和下个星期日之间

如何在 C++ 中找到给定年份一个月中的第二个星期二?

如何用Java获取过去的星期日和即将到来的星期日?

java一个月的最后一个星期日

每月获得第二个星期一,星期三和星期五的规则

Excel:一个月的第三个星期三