0

我有一张员工记录小时历史记录的表,它有员工 ID、上班时间、下班时间。我需要将此行转换为多行以计时的小时数。如果员工在上午 10:00 到下午 6:00 之间打卡,我需要在上午 10 点、上午 11 点……到下午 5 点之前设置 8 行

样本输入

Id  start time  end time    work hours
1       10:00   18:00       8
2       09:00   18:00       9

ID 1 的所需结果

Id  st_time work hours
1   10:00   1
1   11:00   1
1   12:00   1
1   13:00   1
1   14:00   1
1   15:00   1
1   16:00   1
1   17:00   1
1   18:00   1
4

1 回答 1

0

虽然 Teradata 支持TIME数据类型,但建议使用TIMESTAMP WITH TIME ZONETIMESTAMP(隐含时区)。这是一个使用TIMESTAMP数据类型和EXPAND ON

CREATE VOLATILE TABLE example (
  id INTEGER NOT NULL, str_time TIMESTAMP(0) NOT NULL, end_time TIMESTAMP(0) NOT NULL) 
  PRIMARY INDEX(id) on commit preserve rows;
  
INSERT example VALUES(1,'2020-01-07 10:00:00','2020-01-07 18:00:00');
INSERT example VALUES(2,'2020-01-07 09:00:00','2020-01-07 18:00:00');
INSERT example VALUES(3,'2020-01-07 17:15:00','2020-01-08 03:45:00');

SELECT id, str_time, end_time, BEGIN(pd) AS bucket_str, END(pd) AS bucket_end,
  CAST((LEAST(END(pd),end_time) - GREATEST(BEGIN(pd),str_time) MINUTE) AS DECIMAL(4,2))/60 AS worked_hours
FROM
  (SELECT id, str_time, end_time, pd
    FROM example
    EXPAND ON PERIOD(str_time,end_time) pd
    BY ANCHOR PERIOD ANCHOR_HOUR -- Expand to multiple rows starting/ending on the hour
  ) AS xpand
  ORDER BY id, bucket_str; 

添加额外的列和 ORDER BY 只是为了帮助澄清流程,可以省略。

于 2021-01-08T22:22:09.470 回答