Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

कर्मचारियों के लिए स्वाइप-इन और स्वाइप-आउट के बीच समय का अंतर; अलग-अलग दिन टेलगेटिंग और बाहर निकलने की अनुमति दें

एक दोस्त की मदद से, मैंने प्वाइंट # 2 . में उल्लिखित समस्या को हल किया :नीचे दिए गए चरणों से, जैसा कि मैं केवल sql स्क्रिप्ट में समाधान चाहता था, अपने छोटे sql ज्ञान के साथ मैंने 3 चरणों में समाधान तैयार किया, मुझे यकीन है कि इसे विशेषज्ञों द्वारा सरल तरीके से नियंत्रित किया जा सकता है:

आधार तालिका को EMP_DATA मानते हुए, मैंने एक अस्थायी तालिका का उपयोग किया:Temp_1आधार तालिका के लिए मैंने अंतिम चरण में रिकॉर्ड को फ़्लैग करने के लिए "वैधता" फ़ील्ड जोड़ा है।

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

चरण1:

नीचे दी गई क्वेरी EMP_DATA में पंक्तियों के लिए पंक्ति संख्या निर्दिष्ट करेगी और उन्हें 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

चरण 1 आउटपुट:

 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

चरण2:

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

चरण 2 आउटपुट:

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

चरण 3:

LastEvent और NextEvent के आधार पर हम टेलगेट की गई प्रविष्टियों की पहचान कर सकते हैं और मुख्य तालिका EMP_DATA को निम्न क्वेरी द्वारा अपडेट कर सकते हैं:

 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

अंतिम आउटपुट: *चरण 3 आउटपुट: *

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. तालिका अपडेट करें और फिर MySQL में अपडेट की गई पंक्तियां लौटाएं

  2. HTML में mysql न्यूलाइन प्रदर्शित करें

  3. एकाधिक पंक्तियों में अधिकतम मान के आधार पर एकल पंक्ति का चयन कैसे करें

  4. MySQL DATE_ADD काम नहीं करता

  5. समूह द्वारा उपयोग करें और पंक्ति की पहचान वापस करें