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