【问题标题】:Count Data each shift schedule计数数据每班时间表
【发布时间】:2020-03-03 06:54:58
【问题描述】:

您好,我正在尝试编写查询,根据他/她从 tblshiftsched 的轮班时间表,我将给出每个员工大于 10 的持续时间计数。

Shift A - 6AM - 2PM
Shift B - 2PM - 10PM
Shift C - 10PM - 6AM 

tbleeventlogs

EVENTID     USERID      DATE_TIME   READERID                 READERNAME LOGTYPE   RESULT DURATION

188110074       50078       2020-03-02 22:01:31 544381441       LOCKER      IN   00:12  12
188099752       50078       2020-03-02 21:48:52 544381436       LOCKER      OUT             
188098672       50078       2020-03-02 21:47:10 544381441       LOCKER      IN              
188098656       50078       2020-03-02 21:47:06 544381441       LOCKER      IN   15:45  945
187972279       50078       2020-03-02 06:01:54 544381436       LOCKER      OUT             
187949027       50078       2020-03-02 04:30:46 544381441       LOCKER      IN   00:16  16
187933475       50078       2020-03-01 22:44:47 544381431       LOCKER      IN   00:04  4
187933289       50078       2020-03-01 22:40:41 544381436       LOCKER      OUT             
187926256       50078       2020-03-01 22:01:31 544381431       LOCKER      IN   00:14  14
187914503       50078       2020-03-01 21:46:42 544381428       LOCKER      OUT  
180769437       1214201592  2020-01-20 08:13:06 544381436       LOCKER      OUT  
180771730       1214201592  2020-01-20 08:36:38 544381431       LOCKER      IN   00:23  23
180775099       1214201592  2020-01-20 09:07:04 544381436       LOCKER      OUT  
180777340       1214201592  2020-01-20 09:30:53 544381431       LOCKER      IN   00:23  23
180778948       1214201592  2020-01-20 09:48:58 544381436       LOCKER      OUT  
180781714       1214201592  2020-01-20 10:04:52 544381431       LOCKER      IN   00:15  15

tblemployeegroup

EMPLOYEEID  EMPLOYEENAME        GROUPCODE   

050078      ARCIAGA,        SC-G3-4G                    
1214201592  CALMA, VILMA LARIN  ASSR2*              
003502      ORRICA, MARY MELIN  ACBA1

tblshiftsched

SHIFTCODE   DATESHIFT       STARTSHIFT                      ENDSHIFT                                ISRESTDAY

SC-G3-4G           1/24/2020        1/1/1970 2:00:00.000000 PM  1/1/1970 10:00:00.000000 PM              0
SC-G3-4G        1/25/2020       1/1/1970 2:00:00.000000 PM  1/1/1970 10:00:00.000000 PM              0
SC-G3-4G        1/26/2020       1/1/1970 2:00:00.000000 PM  1/1/1970 10:00:00.000000 PM             0
SC-G3-4G        1/27/2020       1/1/1970 2:00:00.000000 PM  1/1/1970 10:00:00.000000 PM             0
SC-G3-4G        2/10/2020       1/1/1970 10:00:00.000000 PM 1/1/1970 6:00:00.000000 AM              0
SC-G3-4G        2/11/2020       1/1/1970 10:00:00.000000 PM 1/1/1970 6:00:00.000000 AM              0
SC-G3-4G        2/12/2020       1/1/1970 10:00:00.000000 PM 1/1/1970 6:00:00.000000 AM              0

我能够计算数据,但它是按每个日期计算的,我的问题是我只捕获 Shift A 和 Shift B,因为我每天获取数据而 Shift C 需要 2 天

如果用户在 3 月 2 日晚上 10 点到 3 月 3 日早上 6 点是 Shift C i,则它跨越数天

 SELECT   a.userid, a.username,
            TRUNC (TO_DATE (a.date_time, 'YYYY-MM-DD HH24:MI:SS')
                  ) AS date_time,
            COUNT (a.DURATION) COUNT
       FROM tblaccesslogs a
      WHERE DURATION > 10
   GROUP BY a.username,
            a.userid,
            TRUNC (TO_DATE (a.date_time, 'YYYY-MM-DD HH24:MI:SS'));

注意这和我之前的问题my previous question有关

希望你明白我的意思

更新 我有查询,但我无法确定该员工是早/晚入还是早/晚出。 因此,如果他在 A 班迟到了,则算作 B 班,因为他在 B 班的时间迟到了。

  SELECT   a.userid, a.username,
            TRUNC(TO_DATE(A.DATE_TIME,'YYYY-MM-DD HH24:MI:SS')) AS DATE_TIME,
            case when to_char(TO_DATE (a.date_time, 'YYYY-MM-DD HH24:MI:SS'),'HH24') between 6 and 13 then 'A'
                  when to_char(TO_DATE (a.date_time, 'YYYY-MM-DD HH24:MI:SS'),'HH24') between 14 and 21 then 'B'
              else 'C' end as shift,
            COUNT (a.DURATION) COUNT
       FROM tblaccesslogs a
      WHERE DURATION > 10
   GROUP BY a.username,
            a.userid,
             TRUNC(TO_DATE(A.DATE_TIME,'YYYY-MM-DD HH24:MI:SS')),
            case when to_char(TO_DATE (a.date_time, 'YYYY-MM-DD HH24:MI:SS'),'HH24') between 6 and 13 then 'A'
                  when to_char(TO_DATE (a.date_time, 'YYYY-MM-DD HH24:MI:SS'),'HH24') between 14 and 21 then 'B'
              else 'C' end

【问题讨论】:

  • 我完全迷路了。班次都是8小时。你说的持续时间是多少?
  • tbleventlogs 中的持续时间,我想加入 tbleventlogs 以了解员工每天的轮班时间表

标签: sql oracle


【解决方案1】:

您的查询没有捕捉到任何变化,请尝试以下操作:

SELECT   a.userid, a.username,
            case when to_char(TO_DATE (a.date_time, 'YYYY-MM-DD HH24:MI:SS'),'HH24') between 6 and 13 then 'A'
                  when to_char(TO_DATE (a.date_time, 'YYYY-MM-DD HH24:MI:SS'),'HH24') between 14 and 21 then 'B'
              else 'C' end as shift,
            COUNT (a.DURATION) COUNT
       FROM tblaccesslogs a
      WHERE DURATION > 10
   GROUP BY a.username,
            a.userid,
            case when to_char(TO_DATE (a.date_time, 'YYYY-MM-DD HH24:MI:SS'),'HH24') between 6 and 13 then 'A'
                  when to_char(TO_DATE (a.date_time, 'YYYY-MM-DD HH24:MI:SS'),'HH24') between 14 and 21 then 'B'
              else 'C' end

(我没有尝试代码,所以可能留下了一个'('或类似的东西,我也留下了to_date并且没有提取HH组件以防万一您有其他格式而不是显示)

【讨论】:

  • 你得到了我需要的东西,但轮班时间表不是来自表 tblshiftsched
  • 您所做的是计算每个班次大于 10 的持续时间,但我需要计算每天的持续时间,具体取决于班次安排,情况是班次 C 跨度为 2 天,因为从晚上 10 点到早上 6 点
  • 有一个用户早到晚了怎么办?
  • 那么,您是说如果 date_time 从 A 班开始,但持续时间超过 8 小时(并且小于 16 小时),那么该行应该在 B 班吗?
猜你喜欢
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2018-11-29
  • 2019-04-10
相关资源
最近更新 更多