MySQL:从日期时间列计算连续工作日数

Posted

技术标签:

【中文标题】MySQL:从日期时间列计算连续工作日数【英文标题】:MySQL: Count no of consecutive week days from datetime column 【发布时间】:2014-02-03 14:08:20 【问题描述】:

我有下表:

studentid VARCHAR(12)
latetime DATETIME
attendance CHAR(1)

latetime 只有工作日。

有些日子学生会有“家长信”用V表示出勤栏。

我需要将这些出勤列 V 按连续的工作日分组。 然后计算这些出现次数。 每组连续天数计为1个字母。

我的 SQLFIDDLE:http://sqlfiddle.com/#!2/55d5b/1

此 SQLFIDDLE 示例数据应返回

STUDENTID   LETTERCOUNT
a1111           3
b2222           2


a1111 - 3 counts
-----
1. 2014-01-02
2. 2014-01-27
2. 2014-01-29 and 2014-01-30

b2222 - 2 counts
-----
1. 2014-01-02 and 2014-01-03
2. 2014-01-24, 2014-01-27 and 2014-01-28

我尝试了以下 SO 中的各种方法,但没有任何正确的结果:

How to GROUP BY consecutive data (date in this case)

mysql: group by consecutive days and count groups

我可以通过循环遍历结果并手动检查每条记录及其下一个日期,以编程方式在 php 中执行此操作。但我试图用 SQL 来达到同样的效果。

我们将不胜感激任何帮助/寻找解决方案的方向。

【问题讨论】:

你认为你的数据集能恰当地代表手头的问题吗? 我认为“工作日”是不够的,因为它没有考虑到节假日。您有预计出勤天数的日历吗? 这是一组简化的数据,其中不必要的数据和列已被删除。 我可以创建另一个具有预期出勤天数的表。目前假期在 PHP 代码中被过滤。 【参考方案1】:

这来自MySQL: group by consecutive days and count groups 中的一个答案。我添加了WITH ROLLUP 选项以将字母计数纳入同一查询,并使用GROUP_CONCAT 显示所有日期。我在工作日设置了INTERVAL,以跳过周末;不过,假期没有考虑在内。

在我的小提琴版本中,我将latetime 列更改为date,因此我可以从SQL 中删除所有DATE() 函数。

SELECT studentid, IFNULL(dates, '') dates, IF(dates IS NULL, lettercount, '') lettercount
FROM (
    SELECT studentid, dates, COUNT(*) lettercount
    FROM (
        SELECT v.studentid,
          GROUP_CONCAT(latetime ORDER BY latetime SEPARATOR ', ') dates
        FROM
          (SELECT studentid, latetime,
                @start_date := IF(@last_student IS NULL OR @last_student <> studentid,
                         1,
                         IF(@last_latetime IS NULL
                            OR (latetime - INTERVAL IF(WEEKDAY(latetime) = 0, 3, 1) DAY) > @last_latetime, latetime, @start_date)) AS start_date,
                @last_latetime := latetime,
                @last_student := studentid
           FROM
             studentattendance, (SELECT @start_date := NULL, @last_latetime := NULL, @last_student := NULL) vars
           WHERE attendance = 'V'
           ORDER BY
             studentid, latetime
          ) v
        GROUP BY
          v.studentid, start_date) x
    GROUP BY studentid, dates WITH ROLLUP) y
WHERE studentid IS NOT NULL
ORDER BY studentid, dates

http://sqlfiddle.com/#!2/6c944/12

【讨论】:

以上是关于MySQL:从日期时间列计算连续工作日数的主要内容,如果未能解决你的问题,请参考以下文章

Excel 两个日期之间间隔的工作日数,非头尾,大家帮我看看我这样做,结果不对呀?问题出在哪了?不甚感激!

Luxon js从工作日数中获取日期

mysql 年龄计算(根据生日字段)

在Python中动态计算不包括假期日历的工作日数

如何计算日历表中只有值为 1 的 2 列日期之间的天数 - postgreSQL?

如何计算确定日期的工作日数?