mysql - 将列值映射到其包含行的日期

标签 mysql sql datetime select

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

我的 table 看起来像这样:

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

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

最佳答案

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

关于mysql - 将列值映射到其包含行的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27350937/

相关文章:

php - Laravel Eloquent 乘列总和

sql - View 的复杂性——综合还是构建?

datetime - 将 12 小时日期/时间转换为 24 小时日期/时间

Mysql - 如何将日期从 ISO 8601 格式转换并保存到 mysql 列?

mysql - 比较表中的两个日期时间字段并根据结果显示另一个表中的记录

MySQL:如何忽略该列不明确

mysql - "..."中的未知列 "where clause"

php - 如何防止 PHP 中的 SQL 注入(inject)?

java - Hibernate 结果按日期年/月分组

sql - 从存储过程在 SSRS 中使用多个参数返回空白