MySQL:从datetime列开始计算连续工作日的数量

时间:2014-02-03 14:08:21

标签: php mysql sql datetime

我有下表:

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

晚些时候只有工作日。

有些日子,学生将有“家长信”,由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实现同样的目标。

我们非常感谢您寻求解决方案的任何帮助/方向。

1 个答案:

答案 0 :(得分:0)

这源自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