【问题标题】:count by person by month between days in mysql在mysql中的天之间按月按人计算
【发布时间】:2020-03-13 16:30:08
【问题描述】:

我有一张缺席表,其中包含 3 列 id, begin_dt, end_dt。我需要计算该月有多少 id 至少缺勤一天。因此,例如有如下一行:

id  begin_dt    end_dt
1   01/01/2020  02/02/2020
2   02/02/2020  02/02/2020

我的结果必须是

month   count
01-2020 1
02-2020 2

我想在 DATE_FORMAT(SYSDATE(), '%Y-%m') 上与 group by,但我不知道如何处理我们必须查找整个期间 begin_dt 到 end_dt 的事实

你可以在这里找到这个例子的工作表:https://www.db-fiddle.com/f/rYBsxQzTjjQ9nGBEmeAX6W/0 架构 (MySQL v5.7)

CREATE TABLE absence (
  `id` VARCHAR(6),
  `begin_dt` DATETIME,
  `end_dt` DATETIME
);

INSERT INTO absence
  (`id`, `begin_dt`, `end_dt`)
VALUES
  ('1', DATE('2019-01-01'), DATE('2019-02-02')),
  ('2', DATE('2019-02-02'), DATE('2019-02-02'));

查询 #1

    select * from absence;

| id  | begin_dt            | end_dt              |
| --- | ------------------- | ------------------- |
| 1   | 2019-01-01 00:00:00 | 2019-02-02 00:00:00 |
| 2   | 2019-02-02 00:00:00 | 2019-02-02 00:00:00 |

View on DB Fiddle

【问题讨论】:

标签: mysql


【解决方案1】:
SELECT DATE_FORMAT(startofmonth, '%Y-%m-01') year_and_month,
       COUNT(*) absent_person_count
FROM absence
JOIN ( SELECT DATE_FORMAT(dt + INTERVAL n MONTH, '%Y-%m-01') startofmonth,
              DATE_FORMAT(dt + INTERVAL n MONTH, '%Y-%m-01') + INTERVAL 1 MONTH - INTERVAL 1 DAY endofmonth
       FROM ( SELECT MIN(begin_dt) dt
              FROM absence ) startdate,
            ( SELECT 0 n UNION ALL 
              SELECT 1 UNION ALL 
              SELECT 2 UNION ALL 
              SELECT 3 UNION ALL 
              SELECT 4 UNION ALL 
              SELECT 5 ) numbers,
            ( SELECT DATE_FORMAT(MIN(begin_dt), '%Y-%m') mindate, 
                     DATE_FORMAT(MAX(end_dt), '%Y-%m') maxdate 
              FROM absence ) datesrange
       WHERE DATE_FORMAT(dt + INTERVAL n MONTH, '%Y-%m') BETWEEN mindate AND maxdate ) dateslist
    ON  begin_dt <= endofmonth
    AND end_dt >= startofmonth
GROUP BY year_and_month;

fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 2018-12-16
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多