2017-04-25 5 views
0

私は人が作業した分数を返すクエリを作成しようとしています。人は多くのエントリーを持ち、同じ日に出ることができます。私は、出入りまでの合計時間を知りたいです。Sqlレコード間の合計時間数

ここでは、テーブルの絵:たとえばTABLE

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 
を:20498090Rは79分

を返すようにするために、私はこのクエリを試みるが、それはうまく動作しない希望このクエリでは

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

@jarlh MSSQLが、最後に、SQL – Pablo

+0

MySQLとMS SQL Serverが異なる日付/時刻の機能を持っています。 – jarlh

+0

@jarlh混乱して申し訳ありませんが、最初の投稿は私のクエリです – Pablo

答えて

1

FROM SELECT Empleado FOR

DECLARE @LV_EMP_CUR CURSOR
DECLARE @LV_EMP VARCHAR(32)

DECLARE @LV_MINUTESフロート

SET @のLV_EMP_CUR = CURSOR従業員とタイムスタンプによって注文されたサインインテーブルから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何かリクEこれ: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ウィンドウ関数のLEADを使用し、ユーザーと日によって仕切られています。その後、同じユーザーと同じ日付の2回の作業分を計算しました。

データを一時テーブルに挿入してグループ化し、合計作業時間を取得します。 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] 
;