Оператор выбора SQL Server для диапазона дат? - PullRequest
2 голосов
/ 13 июля 2011

У меня есть база данных с тысячами записей, в которых есть два поля даты / времени, давайте назовем их In и Out:

In                                      Out
2011-06-16 13:45:11.000    2011-06-16 13:49:12.000
2011-06-16 13:51:31.000    2011-06-16 14:23:17.000
2011-06-16 14:51:54.000    2011-06-16 14:58:43.000

и так далее ...

На входе у меня есть временные рамки (timeIn и timeOut). На выходе мне нужно знать кумулятивное количество секунд между «входом» и «выходом» в каждой из записей, которые попадают в этот период времени. Проиллюстрировать эту диаграмму проще:

http://i150.photobucket.com/albums/s99/dc2000_bucket/sql_graph.jpg

Принимая имена из диаграммы, мне нужно знать «Интервал времени 1 (в секундах)» + «Интервал времени 2 (в секундах)» + «Интервал времени 3 (в секундах)». Как составить такой оператор SQL?

Ответы [ 2 ]

2 голосов
/ 13 июля 2011
select sum(datediff(second, [In], case when @TimeOut < [Out] 
                                    then @TimeOut 
                                    else [Out] 
                                  end))
from YourTable
where [In] between @TimeIn and @TimeOut

Или так, если вы хотите включить интервалы, которые заканчиваются в @TimeIn - @TimeOut.

select sum(datediff(second, case when @TimeIn < [In] 
                              then [In]
                              else @TimeIn
                            end, 
                            case when @TimeOut < [Out] 
                              then @TimeOut 
                              else [Out] 
                            end))
from YourTable
where [In] <= @TimeOut and 
      [Out] >= @TimeIn
1 голос
/ 13 июля 2011

В SQL-сервере нет функции GREATEST() или LEAST(), или она будет выглядеть следующим образом:

SELECT LEAST(t.timeOut, @TimeOut) - GREATEST(t.timeIn,@TimeIn) 
FROM tableX AS t
WHERE t.timeIn <= @TimeOut
  AND @TimeIn <= t.timeOut

Использование CASE:

SELECT DATEDIFF( second
               , CASE WHEN t.timeIn <= @TimeIn
                        THEN @TimeIn
                        ELSE t.timeIn
                 END
               , CASE WHEN t.timeOut <= @TimeOut
                        THEN t.timeOut
                        ELSE @TimeOut
                 END 
               )
       AS TimeInterval 
FROM tableX AS t
WHERE t.timeIn <= @TimeOut
  AND @TimeIn <= t.timeOut
ORDER BY t.timeIn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...