Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chênh lệch thời gian giữa vuốt vào và quẹt ra cho nhân viên; cho phép điều hướng và đi ra vào những ngày khác

Với sự giúp đỡ của một người bạn, tôi đã giải quyết được vấn đề được đề cập trong Điểm # 2 :theo các bước dưới đây, Vì tôi muốn giải pháp chỉ trong tập lệnh sql, với kiến ​​thức sql nhỏ của mình, tôi đã thiết kế giải pháp theo 3 bước, tôi chắc chắn rằng giải pháp có thể được các chuyên gia xử lý theo cách đơn giản hơn:

Xem xét bảng cơ sở là EMP_DATA, tôi đã sử dụng một bảng tạm thời:Temp_1Đối với bảng cơ sở, tôi đã thêm trường "VALIDITY" để gắn cờ các bản ghi ở bước cuối cùng.

EMP_DATA:

EMPID EVENT_TYPE Swipe_time       VALIDITY
1     EN1        2012-06-01 12:00
1     EX         2012-06-01 12:30
2     EN1        2012-06-01 12:50
1     EN2        2012-06-01 13:10
1     EN2        2012-06-01 15:50
2     EX         2012-06-01 13:30
2     EN1        2012-06-01 14:00
2     EX         2012-06-02 19:00
1     EX         2012-06-02 19:30

Bước 1:

truy vấn bên dưới sẽ chỉ định số hiệu cho các hàng trong EMP_DATA và sao chép chúng vào bảng temp_1:

create table Temp_1 (EMP_ID int, Event_Type char(10), Swipe_Time datetime, rownum int, Lastevent char(10), Nextevent char(10)) 

Insert into  Temp_1             
SELECT  EMP_ID, EVENT_TYPE,
ROW_NUMBER() OVER ( PARTITION BY EMP_ID 
ORDER BY SWIPE_TIME ) AS RowNumber      
    FROM EMP_DATA

Bước 1 Đầu ra:

 EMPID EVENT_TYPE Swipe_time         RowNumber  LastEvent  NextEvent
1     EN1        2012-06-01 12:00    1
1     EX         2012-06-01 12:30    2
2     EN1        2012-06-01 12:50    1
1     EN2        2012-06-01 13:10    3
1     EN2        2012-06-01 15:50    4
2     EX         2012-06-01 13:30    2
2     EN1        2012-06-01 14:00    3
2     EX         2012-06-02 19:00    4
1     EX         2012-06-02 19:30    5

Bước 2:

xác định sự kiện cuối cùng (sự kiện trước đó) và sự kiện tiếp theo cho mỗi sự kiện trong hàng của bảng temp_1

 Update  main set main.LastEvent =yy.LEvent,main.NextEvent=yy.NEvent
 from TEMP_1 main
 inner join
 ( SELECT   A.EMP_ID , A.EVENT_TYPE, A.SWIPE_TIME, A.ROWNUMBER                                                                                                                                                                                                                                                          
               COALESCE(LastVal.ZONE_NAME, 'N/A') AS LEvent ,                                                                                                                                                                                                                                                               
                   COALESCE(NextVal1.ZONE_NAME, 'N/A') AS NEvent                                                                                                                                                                                                                                                       
          FROM Temp_1  A                                                                                                                                                                                                                                                               
               LEFT JOIN Temp_1 LastVal                                                                                                                                                                                                                                                        
                  ON A.EMP_ID= LastVal.EMP_ID
                     AND A.ROWNUMBER - 1 = LastVal.ROWNUMBER                                                                                                                                                                                                                                                   
               LEFT JOIN Temp_1 NextVal1                                                                                                                                                                                                                                                    
                  ON A.EMP_ID= NextVal1.EMP_ID
                     AND A.ROWNUMBER + 1 = NextVal1.ROWNUMBER)yy                                       
on main.EMP_ID=yy.EMP_ID,
and main.event_type=yy.event_type
and main.swipe_time = yy.swipe_event

Bước 2 Đầu ra:

EMPID EVENT_TYPE Swipe_time         RowNumber  LastEvent  NextEvent
1     EN1        2012-06-01 12:00    1           N/A        EX
1     EX         2012-06-01 12:30    2           EN1        EN2
2     EN1        2012-06-01 12:50    1           N/A        EX
1     EN2        2012-06-01 13:10    3           EX         EN2
1     EN2        2012-06-01 15:50    4           EN2        EX
2     EX         2012-06-01 13:30    2           EN1        EN1
2     EN1        2012-06-01 14:00    3           EX         EX
2     EX         2012-06-02 19:00    4           EN1        N/A
1     EX         2012-06-02 19:30    5           EN2        N/A

Bước 3:

Dựa trên LastEvent và NextEvent, chúng tôi có thể xác định các mục nhập được điều chỉnh và cập nhật bảng chính EMP_DATA bằng truy vấn dưới đây:

 Update emp set emp.VALIDITY='N'
from EMP_DATA
INNER JOIN
(select *
from TEMP_1
where (EVENT_TYPE = 'EX' and LastEvent = 'EX') 
or (EVENT_TYPE IN ('EN1','EN2') and NextEvent  IN ('EN1','EN2')))yy
ON emp.EMP_ID = yy.EMP_ID
and emp.EVENT_TYPE = yy.EMP_ID
and emp.Swipe_time = yy.Swipe_time

Đầu ra cuối cùng: * Bước 3 Đầu ra: *

EMPID EVENT_TYPE Swipe_time       VALIDITY
1     EN1        2012-06-01 12:00
1     EX         2012-06-01 12:30
2     EN1        2012-06-01 12:50
1     EN2        2012-06-01 13:10    N
1     EN2        2012-06-01 15:50    
2     EX         2012-06-01 13:30
2     EN1        2012-06-01 14:00
2     EX         2012-06-02 19:00
1     EX         2012-06-02 19:30



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng một câu lệnh Python cho câu lệnh SQL INSERT

  2. Làm cách nào để chọn các hàng được nhóm lại chỉ có giá trị NULL?

  3. Nhận dữ liệu MySql và lưu trữ nó vào mảng Javascript

  4. truy vấn sql để tìm kiếm và thay thế văn bản trong tất cả các hàng

  5. Giải thích về khung tính khả dụng cao của MySQL - Phần III:Tình huống thất bại