按日期透视 DateTime 字段

Posted

技术标签:

【中文标题】按日期透视 DateTime 字段【英文标题】:Pivot DateTime fields by date 【发布时间】:2018-04-30 20:59:44 【问题描述】:

我有一个包含员工“打卡”(打卡/打卡)的表格,每个打卡可以是“打卡”(打卡类型=1)或“打卡”(打卡类型=2)。

表格格式如下:

    emp_num | report_date | punch_time             | punch_type
    -----------------------------------------------------------
    1       | 2018-04-20  |2018-04-20 04:46:00.000 | 1
    1       | 2018-04-20  |2018-04-20 06:58:00.000 | 2
    1       | 2018-04-20  |2018-04-20 08:10:00.000 | 1
    1       | 2018-04-20  |2018-04-20 12:00:00.000 | 2 

我试图在同一行中获得第一个“打卡”(打卡)和下一个“打卡”(打卡)。那么,当然,任何后续都是一样的。

期望的输出:

    emp_num | report_date | punch_in               | punch_out
    -----------------------------------------------------------
    1       | 2018-04-20  |2018-04-20 04:46:00.000 | 2018-04-20 06:58:00.000
    1       | 2018-04-20  |2018-04-20 08:10:00.000 | 2018-04-20 12:00:00.000

请记住,如示例所示,一天内可能会有多个打入/打出组合。

任何帮助将不胜感激!

【问题讨论】:

这和PIVOT有什么关系? 到目前为止你尝试了什么? 我在想我可能需要对数据进行透视才能实现“打孔列” 打入和打出是punch typescase statement 炸开,所以如果您向我们展示您的尝试,我们可以为您提供帮助.. 说实话并不难 抱歉,起初误解了您的问题 - 我的回答应该适合您,请看一下 【参考方案1】:

首先你要知道哪个打卡时间属于哪个打卡时间。答:第n次打卡时间属于第n次打卡时间。所以给你的记录编号:

select
  p_in.emp_num,
  p_in.report_date,
  p_in.punch_time as punch_in,
  p_out.punch_time as punch_out
from
(
  select
    emp_num,
    report_date,
    punch_time,
    row_number() over (partition by emp_num, report_date order by punch_time) as rn
  from mytable
  where punch_type = 1
) p_in
left join
(
  select
    emp_num,
    report_date,
    punch_time,
    row_number() over (partition by emp_num, report_date order by punch_time) as rn
  from mytable
  where punch_type = 2
) p_out on p_out.emp_num = p_in.emp_num
        and p_out.report_date = p_in.report_date
        and p_out.rn = p_in.rn
order by p_in.emp_num, p_in.report_date, punch_in;

【讨论】:

【参考方案2】:
select emp_num, report_date, max(case when punch_type=1 then punch_time else null end) punch_in, 
max(case when punch_type=2 then punch_time else null end) punch_out 
from (select *, row_number() over(partition by emp_num, report_date, punch_type order by emp_num, report_date, punch_time) value from yourtable )a
group by emp_num, report_date, value

【讨论】:

以上是关于按日期透视 DateTime 字段的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MySQL 的 DATETIME 字段中仅选择日期?

Django 按时间过滤日期时间字段,与日期无关

[django]用日期来查询datetime类型字段

[django]用日期来查询datetime类型字段

[django]用日期来查询datetime类型字段

Access 2007:查询两个短日期值之间的 DateTime 字段