2017-11-12 38 views
0

私は以下のクエリを表示しています。時間間隔の計算中は、チェックアウトが同じ日付の場合にのみ時間間隔を表示します。例えば、私が11/12/2017にチェックインした場合、同じ日付でチェックアウトする必要があります。11/12/201 n時間間隔を計算します。SQLビュークエリで2つの日付間の時間間隔の計算が必要

しかし、私は翌日(12:00深夜以降)チェックアウトしても時間間隔を計算する必要があります。希望の結果を得るためにクエリを変更する手助けをしますか?

問合せ:

ALTER VIEW [dbo].[TimeAttendanceQuery] 
AS 
SELECT TOP (100) PERCENT 
    dbo.AxPerson.Name, 
    dbo.AxPerson.IdNumber AS EmployeeID, 
    dbo.TimeAttendance.Badge, 
    dbo.AxPerson.Id, 
    MIN(dbo.TimeAttendance.EventTime) AS EntryTime, 

    MAX(dbo.TimeAttendance.EventTime) AS ExitTime, 
    CAST(DATEDIFF(second, MIN(dbo.TimeAttendance.EventTime), MAX(dbo.TimeAttendance.EventTime))/60/60/24 AS NVARCHAR(50)) + 
    ':' + CAST(DATEDIFF(second, MIN(dbo.TimeAttendance.EventTime), MAX(dbo.TimeAttendance.EventTime))/60/60 % 24 AS NVARCHAR(50)) + ':' + CAST(DATEDIFF(second, MIN(dbo.TimeAttendance.EventTime), MAX(dbo.TimeAttendance.EventTime))/60 % 60 AS NVARCHAR(50)) 
    AS TimeInterval, 
    dbo.TimeAttendance.Event, 
    dbo.AxPerson.Type AS ShitType, 
    dbo.AxPerson.ShiftDesc, 
    CONVERT(Varchar,dbo.TimeAttendance.EventTime, 101) AS EventTIME 

FROM 
    dbo.AxPerson 
INNER JOIN dbo.TimeAttendance ON dbo.AxPerson.Name = dbo.TimeAttendance.Name 
GROUP BY dbo.AxPerson.Name, dbo.AxPerson.IdNumber, dbo.TimeAttendance.Badge, CONVERT(Varchar, dbo.TimeAttendance.EventTime, 101), dbo.   AxPerson.ShiftDesc, dbo.AxPerson.Id, dbo.TimeAttendance.Event,dbo.AxPerson.Type 
ORDER BY dbo.AxPerson.Name, EventTime DESC 

GO 
+0

イベントタイプを決定する列がありますか?はい、チェックインイベントの価値は何ですか?チェックアウトイベントの価値は何ですか? –

+0

'TOP(100)PERCENT'と' ORDER BY'は、ビュー定義で余分なものを削除してください。結果セットの順序を保証するために、ビューを使用する 'SELECT'ステートメントで' ORDER BY'を指定する必要があります。 –

+0

サンプルデータと望ましい結果が役立ちます。 –

答えて

0

私はあなたが投稿したアルゴリズムについてはよく分からないんだけど、あなたは2つの日付時刻からの時間差を取得したい場合は、時間と減算をキャストすることができます。これは24時間未満で動作します。日数が必要な場合(これは1年未満で良いと思う)、違いのdatepart-dayを実行できます。例えば

DECLARE @starttime datetime = '2017-11-12 010:20:00' 
DECLARE @endtime datetime = '2017-11-13 08:00:00' 

SELECT DATEPART(DAY, @endtime - @starttime) - 1 [Days Passed] 
     ,CAST(@endtime - @starttime as time(0)) [Time Passed] 
     --WHERE the (0) in time(0) is for the milliseconds to return. 

は、出力を提供します:

Days Passed Time Passed 
0   21:40:00 

あなたは日を気にしない場合は、あなたのコードは次のように変更することができます

ALTER VIEW [dbo].[TimeAttendanceQuery] 
AS 
SELECT Name, EmployeeID, Badge, Id, EntryTime, 
     CAST(ExitTime - EntryTime as time(0)) [TimeInterval], 
     Event, ShiftType, ShiftDesc 
     ,CONVERT(Varchar, EventTime, 101) AS EventTIME 
    FROM (
     SELECT 
      dbo.AxPerson.Name, 
      dbo.AxPerson.IdNumber AS EmployeeID, 
      dbo.TimeAttendance.Badge, 
      dbo.AxPerson.Id, 
      MIN(dbo.TimeAttendance.EventTime) AS EntryTime, 
      MAX(dbo.TimeAttendance.EventTime) AS ExitTime,    
      dbo.TimeAttendance.Event, 
      dbo.AxPerson.Type AS ShiftType, 
      dbo.AxPerson.ShiftDesc, 
      dbo.TimeAttendance.EventTime 

      FROM dbo.AxPerson INNER JOIN dbo.TimeAttendance 
            ON dbo.AxPerson.Name = dbo.TimeAttendance.Name 

      GROUP BY 
      dbo.AxPerson.Name, 
      dbo.AxPerson.IdNumber, 
      dbo.TimeAttendance.Badge, 
      dbo.AxPerson.Id, 
      dbo.TimeAttendance.Event, 
      dbo.AxPerson.Type 
      dbo.AxPerson.ShiftDesc, 
      dbo.TimeAttendance.EventTime, 
     ) AS dT 
+0

このアルゴリズムは、同じ日付のチェックインとチェックアウトでのみ機能します。私はチェックイン後24時間の差の時間を計算するために大丈夫です。あなたは私が現在のクエリで変更することができます私を助けることができますか? – fahadrana

関連する問題