将列值映射到具有行的日期

时间:2014-12-08 03:25:39

标签: mysql sql datetime select

我有一个登录表,用于记录不同项目时间的人员,我需要编制一份报告,说明每个项目的工作日期。

我的表看起来像这样:

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

老实说我甚至不知道从哪里开始这样的查询,如果它甚至可能的话。

1 个答案:

答案 0 :(得分:2)

您可以使用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