Mam tabelę tblTask ​​z danymi jak poniżej.

TID   StartTime                   Uid   WId
1     2011-06-06 09:30:00.000     10    1.5
2     2011-06-06 09:40:00.000     10    2.5
3     2011-06-06 09:50:00.000     10    1.8
4     2011-06-06 09:55:00.000     10    2.5
5     2011-06-06 10:30:00.000     10    1.5
6     2011-06-06 11:30:00.000     11    3.0

Muszę napisać do zapytania, aby obliczyć sumę (Wid) na podstawie różnicy czasu każdego czasu rozpoczęcia z innym czasem rozpoczęcia mającym różnicę czasu 1 godzinę lub bliską 1 godziny.

Na przykład weź czas pierwszego uruchomienia (2011-06-06 09:30:00.000); najbliższy czas rozpoczęcia mający <=1 h to (2011-06-06 10:30:00.000), a SUM(Wid) to 1,5+2,5+1,8+2,5+1,5 = 9,8. Podobnie muszę obliczyć dla wszystkich wierszy.

Pożądane wyjście będzie:

TID    StartTime                 EndTime                    TimeDIff(Min) Uid    WId
1      2011-06-06 09:30:00.000   2011-06-06 10:30:00.000    60            10     9.8
2      2011-06-06 09:40:00.000   2011-06-06 10:30:00.000    50            10     8.3
1
Simhadri 13 lipiec 2011, 02:37
2
Dlaczego twój stół nie ma nazwy? Pominięcie nazwy tabeli jest najczęstszym błędem w pytaniach SQL w SO. Ponadto, jaka wartość UID powinna zostać wydrukowana? Min, max, średnia, pierwsza, ostatnia czy jeszcze inna?
 – 
Jonathan Leffler
13 lipiec 2011, 02:48
Przepraszam, zapomniałem podać nazwę tabeli, wartość UID wybranego przez nas czasu rozpoczęcia.
 – 
Simhadri
13 lipiec 2011, 03:08

2 odpowiedzi

Najlepsza odpowiedź

Czy to daje ci to, czego potrzebujesz?

SELECT t1.TID, min(t1.StartTime) AS StartTime, MAX(t2.StartTime) AS EndTime,
    MAX(DATEDIFF(MI, t1.StartTime, t2.StartTime)) AS [TimeDiff(Min],
    t1.Uid, SUM(t2.WId) AS WId
FROM MyTable t1
JOIN MyTable t2 on datediff(MI, t1.starttime, t2.StartTime) BETWEEN 0 AND 60
GROUP BY t1.TID, t1.Uid
ORDER BY t1.TID
2
bobs 13 lipiec 2011, 03:05

Ten blok kodu poda różnicę czasu między StartTime a EndTime

DECLARE @STARTDATE DATETIME = '10:15:45'
DECLARE @ENDDATE DATETIME = '14:00:15'
DECLARE @24DATE DATETIME
SET @24DATE = '23:59:59.000'

IF (@STARTDATE > @ENDDATE)
  SELECT DATEADD(SECOND, 1, CONVERT(TIME(0), (@24DATE -(@ENDDATE - @STARTDATE))))
ELSE
  SELECT CONVERT(TIME(0), ((@ENDDATE - @STARTDATE)))
0
Mikael Eriksson 25 luty 2013, 10:40