2017-04-25 54 views
0

我正在嘗試進行一個查詢,該查詢返回一個人工作的分鐘數。一個人可以有很多條目並在同一天退出。我想知道進入和退出之間的總分鐘數。Sql記錄間總分鐘數

這裏表的圖片:TABLE

例如:我想爲20498090R返回79分鐘

我嘗試此查詢,但它不能很好地工作:

SELECT Empleado, 
    DATEDIFF("mi", Hora, NextDate) 
FROM ( SELECT Empleado, 
       Hora, 
       ( SELECT MIN(Hora) 
        FROM [dbo].[Fichajes] T2 
        WHERE T2.Empleado = T1.Empleado 
        AND  T2.Hora > T1.Hora 
       ) AS NextDate 
     FROM [dbo].[Fichajes] T1 

    ) AS T 

與此查詢:

12212332W --> 
20498090R --> 4 
41435568N --> 6 
20498090R --> 7055 
41435568N --> 
20498090R --> 75 
20498090R --> 
+0

@jarlh MSSQL,但SQL末 – Pablo

+0

MySQL和MS SQL服務器有不同的日期/時間的功能。 – jarlh

+0

@jarlh對不起,第一篇文章是我的查詢 – Pablo

回答

1

從登錄表中創建一個由員工排序的CTE和時間戳,並分配一個行號。現在,您可以將CTE加入自己,只查找員工都登錄並註銷的行。然後你可以找到工作的分鐘數,然後加起來。

;with cte 
as (select f.Empleado, f.Hora, f.Entrada, ROW_NUMBER() over (order by f.Empleado, f.Hora) RowNum 
    from Fichajes f) 

select c1.Empleado, SUM(DATEDIFF(mi, c1.Hora, c2.Hora)) MinutesWorked 
from cte c1 
join cte c2 on c2.Empleado = c1.Empleado and c2.RowNum = c1.RowNum + 1 and c1.Entrada = 1 and c2.Entrada = 0 
group by c1.Empleado 

DEMO

+0

你是我的上帝!它工作完美。 – Pablo

0

使用Cursers東西LIK E該:

DECLARE @LV_EMP_CUR CURSOR
DECLARE @LV_EMP VARCHAR(32)

DECLARE @LV_MINUTES FLOAT

SET @ LV_EMP_CUR = CURSOR FOR SELECT FROM Empleado TABLE_NAME

    OPEN @LV_EMP_CUR FETCH NEXT FROM @LV_EMP_CUR INTO @LV_EMP 
WHILE @@FETCH_STATUS = 0 
    BEGIN 

     DECLARE @DT DATETIME 
     SET @DT = (SELECT HORA FROM TABLE_NAME WHERE [email protected]_EMP) 

     SET @LV_MINUTES= @LV_MINUTES + SELECT CAST(@DT AS TIME) 

     FETCH NEXT FROM @LV_EMP_CUR INTO @LV_EMP 
    END 
CLOSE @LV_EMP_CUR 
DEALLOCATE @LV_EMP_CUR 
0

我已經使用了SQL窗函數導致尋找下一個記錄,由用戶和天分割。然後計算同一用戶和同一日期的兩次之間的工作分鐘。

將數據插入到臨時表中以獲取總工作分鐘數。您可以使用SELECT * FROM #tempTime;在最終選擇查詢之前查看結果進入臨時表的內容。它提供了一個想法,如果代碼工作正常與否。

最終代碼:

IF OBJECT_ID('dbo.Fichajes') IS NULL 
CREATE TABLE dbo.Fichajes(
    [Empleado] [varchar](20) NULL, 
    [Obra] [varchar](20) NULL, 
    [Hora] [datetime2](7) NULL, 
    [Entrada] [bit] NULL, 
    [Motivo] [varchar](20) NULL, 
    [Activated] [bit] NULL 
) 
; 

INSERT [dbo].[Fichajes] ([Empleado], [Obra], [Hora], [Entrada], [Motivo], [Activated]) VALUES (N'12212332W', N'PRY12345', CAST(N'2017-04-17 12:03:00.0000000' AS DateTime2), 1, NULL, NULL) 
INSERT [dbo].[Fichajes] ([Empleado], [Obra], [Hora], [Entrada], [Motivo], [Activated]) VALUES (N'20498090R', N'PRY12345', CAST(N'2017-04-20 12:21:00.0000000' AS DateTime2), 1, NULL, NULL) 
INSERT [dbo].[Fichajes] ([Empleado], [Obra], [Hora], [Entrada], [Motivo], [Activated]) VALUES (N'20498090R', N'PRY12345', CAST(N'2017-04-20 12:25:00.0000000' AS DateTime2), 0, NULL, NULL) 
INSERT [dbo].[Fichajes] ([Empleado], [Obra], [Hora], [Entrada], [Motivo], [Activated]) VALUES (N'41435568N', N'PRY12345', CAST(N'2017-04-20 12:23:00.0000000' AS DateTime2), 1, NULL, NULL) 
INSERT [dbo].[Fichajes] ([Empleado], [Obra], [Hora], [Entrada], [Motivo], [Activated]) VALUES (N'41435568N', N'PRY12345', CAST(N'2017-04-20 12:29:00.0000000' AS DateTime2), 0, NULL, NULL) 
INSERT [dbo].[Fichajes] ([Empleado], [Obra], [Hora], [Entrada], [Motivo], [Activated]) VALUES (N'20498090R', N'PRY12345', CAST(N'2017-04-25 10:00:00.0000000' AS DateTime2), 1, NULL, NULL) 
INSERT [dbo].[Fichajes] ([Empleado], [Obra], [Hora], [Entrada], [Motivo], [Activated]) VALUES (N'20498090R', N'PRY12345', CAST(N'2017-04-25 11:15:00.0000000' AS DateTime2), 0, NULL, NULL) 


IF OBJECT_ID('tempdb..#tempTime') IS NOT NULL DROP TABLE #tempTime; 
with c1 AS 
(
    SELECT 
     [Empleado] 
     ,[Obra] 
     ,[Entrada] 
     ,[Motivo] 
     ,[Activated] 
     ,CONVERT(date, Hora) AS [Date] 
     ,CONVERT(time, Hora, 114) AS [Time] 
     ,[Hora] 
    FROM [dbo].[Fichajes] 
) 
SELECT 
    [Empleado] 
    ,[Hora] 
    ,LAG([Hora]) OVER(PARTITION BY [Empleado], [Date] ORDER BY [Empleado], [Hora] ASC) AS PreviousRecord 
    ,LEAD([Hora]) OVER(PARTITION BY [Empleado], [Date] ORDER BY [Empleado], [Hora] ASC) AS NextRecord 
    ,DATEDIFF(MINUTE, [Hora], LEAD([Hora]) OVER(PARTITION BY [Empleado], [Date] ORDER BY [Empleado], [Hora] ASC)) AS [Minutes] 
INTO #tempTime 
FROM c1 
; 

SELECT 
    [Empleado] 
    ,SUM([Minutes]) AS WorkingMinutes 
FROM #tempTime 
GROUP BY [Empleado] 
;