我已经使用了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