我已經使用了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]
;
@jarlh MSSQL,但SQL末 – Pablo
MySQL和MS SQL服務器有不同的日期/時間的功能。 – jarlh
@jarlh對不起,第一篇文章是我的查詢 – Pablo