2016-11-09 3 views
2

Ich habe eine Tabelle, die verschiedene Zeitbereiche enthält:SQL berechnen Punkte zwischen einem Zeitbereich

Id Start Time End Time Points 
1 0:00  3:00  10 
2 3:01  6:00  20 
3 6:01  23:59  30 

Jetzt muss ich die Punkte berechnen zwischen zwei Datumsbereiche in Bezug auf Zeit erreicht angegeben.

Start date = 11/9/2016 18:17:00 and 
End date = 11/10/2016 01:20:00 

Ich muss die Summe der Punkte zwischen diesen beiden Daten berechnen. Die Zeit des Startdatums, das 18.17 fällt unter Id 3, dessen Punkt ist 30. So wird die Berechnung sein,

18:17 to 23:59 -> 6 hrs -> 6 * 30 = 180 points 

die Endzeit 01.20 fällt unter Id 1

0:00 to 1:20 -> 2 hrs 
(if minute is greater than zero, it is rounded to next hour, ie; 2) -> 2 * 10 = 20 points 

Die Gesamtpunktzahl beträgt somit 200 Punkte. Die Zeitdifferenz zu nehmen, hilft mir nicht, wenn die Anfangs- und Enddatumsdifferenz größer als ein Tag ist.

Tabellenstruktur: Id - int, Starttime - Zeit (7), EndTime - Zeit (7), Punkte - int

Wie eine Abfrage für diese Verwendung von SQL schreiben?

+0

Was ist der Datentyp für Ihre Startzeit und Spalten Endzeit? Was ist dein Datumsformat? 'DDMM' oder' MMDD'? – Tanner

+0

Woher bekommen Sie Ihr Start- und Enddatum? Eine andere Tabelle oder ein Parameter? – Nomeaning25

+0

Datentyp ist Zeit (7) – Joe

Antwort

1

Diese Frage war gut.

Sie können als unten:

DECLARE @Tbl TABLE (Id INT, StartTime TIME, EndTime TIME, Points INT) 
INSERT INTO @Tbl 
VALUES     
(1, '0:00',  '3:00' ,  10), 
(2, '3:01',  '6:00' ,  20), 
(3, '6:01',  '23:59',  30) 


DECLARE @StartDate DATETIME = '2016.11.09 18:17:00' 
DECLARE @EndDate DATETIME = '2016.11.10 01:20:00' 


;WITH CTE 
AS 
(
    SELECT 1 AS RowId, @StartDate CurrentDate, 0 Point, @StartDate DateVal UNION ALL 
    SELECT 
     A.RowId , 
     IIF((A.CurrentDate + A.EndTime) > @EndDate, @EndDate, DATEADD(MINUTE, 1, (A.CurrentDate + A.EndTime))) AS CurrentDate, 
     A.Points, 
     IIF((A.CurrentDate + A.EndTime) > @EndDate, @EndDate, (A.CurrentDate + A.EndTime)) DateVal 
    FROM 
    (
     SELECT 
      C.RowId + 1 AS RowId, 
      CAST(CAST(CurrentDate AS DATE) AS DATETIME) CurrentDate, 
      CAST((SELECT T.EndTime FROM @Tbl T WHERE CAST(CurrentDate AS TIME) BETWEEN T.StartTime AND T.EndTime) AS DATETIME) AS EndTime, 
       (SELECT T.Points FROM @Tbl T WHERE CAST(CurrentDate AS TIME) BETWEEN T.StartTime AND T.EndTime) AS Points, 
      C.CurrentDate AS TempDate 
     FROM CTE C   
    ) A 
    WHERE   
     A.TempDate <> IIF((A.CurrentDate + A.EndTime) > @EndDate, @EndDate, DATEADD(MINUTE, 1, (A.CurrentDate + A.EndTime))) 
), CTE2 
AS 
(
    SELECT 
     C.RowId , 
     C.CurrentDate , 
     C.Point , 
     C.DateVal, 
     DATEDIFF(MINUTE, LAG(C.DateVal) OVER (ORDER BY C.RowId), C.DateVal) MinuteOfDateDiff 
    FROM 
     CTE C 
) 


SELECT 
    SUM(CEILING(C.MinuteOfDateDiff * 1.0/60.0) * C.Point) 
FROM 
    CTE2 C 

Ergebnis: 200

+1

gut funktionierend. .. Thanks a lot NEER – Joe

+0

Neer, ich bin wenig Problem ist, wenn die Zeitschlitze sind, wie nachstehend aufgeführt: Id | StartTime | Endzeit | Punkte 12 | 2:01 | 20:00 Uhr 10 14 | 20:01 | 2:00 | 20 Das Ergebnis, das ich bekommen ist "NULL" Parameter: Startdate = '2016.10.02 00: 41: 00.000', EndDate = '2016.10.02 04: 22: 00.000' Dies, weil es liefert nur eine Zeile und die Zeile „LAG (C.DateVal) OVER (ORDER BY C.RowId)“ für die Berechnung MinuteDiff NULL zurückgibt, gibt es keine vorherige Zeile zu berücksichtigen. Können Sie mir dabei helfen? – Joe

+0

Neer, ich habe wenig Problem, wenn die Zeitschlitze sind, wie nachstehend aufgeführt: Id | StartTime | Endzeit | Punkte --- | -------------- | -------------- | ----------- | 12 | 2:01 | 20:00 Uhr 10 --- | ------------- | --------------- | ----------- | 14 | 20:01 | 2:00 | 20 Das Ergebnis, das ich bekommen ist "NULL" Parameter: Startdate = '2016.10.02 00: 41: 00.000', EndDate = '2016.10.02 04: 22: 00.000' Dies, weil es liefert nur eine Zeile und die Zeile „LAG (C.DateVal) OVER (ORDER BY C.RowId)“ für die Berechnung MinuteDiff NULL zurückgibt, gibt es keine vorherige Zeile zu berücksichtigen. Können Sie mir dabei helfen? – Joe

Verwandte Themen