【问题标题】:Mapping a column value to which dates it has rows of将列值映射到它具有行的日期
【发布时间】:2014-12-08 03:25:38
【问题描述】:

我有一个登录表,供在不同项目上记录时间的人使用,我需要编制一份报告,说明每个项目的工作天数。

我的桌子看起来像这样:

id | project | time_in
----------------------------------
1  | 1       | 2014-12-07 05:00:00
2  | 2       | 2014-12-08 06:00:00
3  | 1       | 2014-12-05 14:00:00
4  | 3       | 2014-12-07 08:30:00
5  | 2       | 2014-12-07 12:00:00
6  | 1       | 2014-12-08 05:00:00
7  | 2       | 2014-12-05 06:00:00
8  | 1       | 2014-12-06 14:00:00
9  | 3       | 2014-12-08 08:30:00
10 | 2       | 2014-12-06 12:00:00

time_in 的类型为 TIMESTAMP

我需要弄清楚的是,给定一个日期范围(例如 12 月 5 日至 8 日),每个项目在一周中的哪几天进行。我对查询非常灵活,即我可以使用循环生成查询,而且我对结果集的外观也很灵活,只要我可以解析它以获得我需要的信息。例如,也许:

project | days
-----------------------------------------------------
1       | 2014-12-07,2014-12-08,2014-12-05,2014-12-06
2       | 2014-12-08,2014-12-07,2014-12-05,2014-12-06
3       | 2014-12-07,2014-12-08

或者更好:

project | d0 | d1 | d2 | d3
---------------------------
1       | 1  | 1  | 1  | 1
2       | 1  | 1  | 1  | 1
3       | 0  | 0  | 1  | 1

如果可能的话,我真的不知道从哪里开始这样的查询。

【问题讨论】:

    标签: mysql sql datetime select


    【解决方案1】:

    您可以使用group_concat 来实现您的初步结果:

    select project, group_concat(date(time_in) order by time_in)
    from yourtable
    group by project
    

    如果你想要更多的列,你可以使用maxcase

    select project, 
      max(case when date(time_in) = '2014-12-05' then 1 else 0 end) d0,
      max(case when date(time_in) = '2014-12-06' then 1 else 0 end) d1,
      max(case when date(time_in) = '2014-12-07' then 1 else 0 end) d2,
      max(case when date(time_in) = '2014-12-08' then 1 else 0 end) d3
    from yourtable
    group by project
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-20
      • 2020-10-17
      • 1970-01-01
      • 2015-08-19
      • 2020-08-25
      • 2018-01-03
      • 1970-01-01
      • 2014-06-08
      相关资源
      最近更新 更多