sql >> Databáze >  >> RDS >> Sqlserver

SQL dotaz na čas docházky

Zkuste toto:

;with cte as
(select *, rank() over(partition by ID_Emp order by [Date]) rn
 from attendance)

select src.ID_Emp, src.Name, convert(date, src.[Date]) as [Date],
concat(datepart(hour,src.[Date]),':',datepart(minute,src.[Date])) as [TimeIn],
concat(datepart(hour,tgt.[Date]),':',datepart(minute,tgt.[Date])) as [TimeOut],
concat(datediff(minute,src.[Date],tgt.[Date])/60,':',datediff(minute,src.[Date],tgt. [Date])%60) as [Hours]
from cte src
inner join cte tgt on src.ID_Emp = tgt.ID_Emp and src.rn + 1 = tgt.rn and src.rn % 2 = 1

Upozornění:Testoval jsem to pouze na SQL Server 2008 R2, ale předpokládám, že by to s příslušnými úpravami mělo fungovat i na Oracle.

Vysvětlení:Používáme RANK funkci seřadit podle data a času pro každý ID_Emp . Poté se připojíme na ID a získat páry řádků. A konečně, abychom zajistili, že nevybereme každý pár po sobě jdoucích řádků, požadujeme, aby pořadí zdrojového řádku bylo liché.



  1. Nejlepší návrhový vzor pro uzavření připojení k databázi, když dojde k výjimce

  2. Odkaz na sloupec nastavení Postgres ON CONFLICT je nejednoznačný

  3. Jak získat počet dní v měsíci v MySQL

  4. vztah nebyl nalezen pomocí Postgres v aplikaci Eclipse Hibernate