java—将两个条目行(开始时间和结束时间)连接为talend中的一行

aij0ehis  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(339)

我有来自ms sql数据库的数据,它与员工的工作时间有关。
问题是,开始时间和结束时间存储为两个不同的条目,因此当员工来时,他扫描他的徽章,这被认为是到达时间,当他离开时,他再次扫描他的徽章,这被认为是离开时间。有一列可以帮助区分开始时间和结束时间(codenr列:b1=starttime,b2=endtime)
我的table就是这个样子

现在我需要这些数据作为一个单独的条目,以talend顺序从数据库中,
所以看起来应该是

为了实现这一点,请使用什么(特别是在talend中,以及何时比ms-sql更复杂)?

lstz6jyr

lstz6jyr1#

  1. CREATE TABLE EmployeeWorkLoad(
  2. EmployeeNr bigint,
  3. Year int,
  4. Month int,
  5. Day int,
  6. Hour int,
  7. Minute int,
  8. CodeNr char(2)
  9. )
  10. Insert into [EmployeeWorkLoad] ( [EmployeeNr],[Year],[Month] ,[Day],[Hour], [Minute] ,[CodeNr]) Values (1,2020,1,4,8,30,'B1'),
  11. (1,2020,1,4,16,45,'B2'),
  12. (1,2020,1,6,8,15,'B1'),
  13. (1,2020,1,6,16,45,'B2'),
  14. (2,2020,3,2,8,10,'B1'),
  15. (2,2020,3,2,16,5,'B2')
  16. GO

6行受影响

  1. WITH CTE AS (
  2. select EmployeeNr,Year,Month,Day,
  3. MAX(CASE WHEN CodeNr='B1' THEN Hour END) AS StartHour,
  4. MAX(CASE WHEN CodeNr = 'B1' THEN Minute END) AS StartMinute,
  5. MAX(CASE WHEN CodeNr = 'B2' THEN Hour END) AS EndHour,
  6. MAX(CASE WHEN CodeNr = 'B2' THEN Minute END) AS EndMinute
  7. from EmployeeWorkLoad
  8. group by EmployeeNr,Year,Month,Day )
  9. SELECT * , ABS(EndHour-StartHour) AS DutationHour
  10. ,ABS(IIF(EndMinute <StartMinute, EndMinute+60, EndMinute)- StartMinute) AS DurationMinute
  11. FROM
  12. CTE
  1. GO
  1. EmployeeNr | Year | Month | Day | StartHour | StartMinute | EndHour | EndMinute | DutationHour | DurationMinute
  2. ---------: | ---: | ----: | --: | --------: | ----------: | ------: | --------: | -----------: | -------------:
  3. 1 | 2020 | 1 | 4 | 8 | 30 | 16 | 45 | 8 | 15
  4. 1 | 2020 | 1 | 6 | 8 | 15 | 16 | 45 | 8 | 30
  5. 2 | 2020 | 3 | 2 | 8 | 10 | 16 | 5 | 8 | 55

db<>在这里摆弄

展开查看全部

相关问题