Фильтровать значения времени, которые являются установленным периодом по обе стороны от указанного времени

Учитывая заданное значение времени и значение интервала:

Specified Time: 13:25:00
Interval Value: 00:20:00

Как я могу отфильтровать следующую таблицу значений для времени возврата, которые являются указанным интервалом по обе стороны от указанного времени.

12:45:24
13:05:00
13:50:30
14:50:32
15:15:10

Я хочу, чтобы функция или запрос проверяли, имеет ли '13:25:00'разницу '00:20:00' с любым из значений времени в таблице.

Вывод должен вернуть:

13:05:00

3 ответа

Решение

Основываясь на предоставленной вами информации, я предполагаю, что вы хотите получить значения из списка, которые являются указанным периодом по обе стороны от вашего "особого времени".

Вот один из способов сделать это, используя DATEADD:

-- temp table for your sample data
CREATE TABLE #times ( val TIME )

INSERT  INTO #times
        ( val )
VALUES  ( '12:45:24' ),
        ( '13:05:00' ),
        ( '13:50:30' ),
        ( '14:50:32' ),
        ( '15:15:10' )

DECLARE @special_time TIME = '13:25:00'      
DECLARE @diff_value TIME = '00:20:00'

-- variable will hold the total number of seconds for your interval
DECLARE @diff_in_seconds INT

-- gets the total number of seconds of your interval -> @diff_value 
SELECT  @diff_in_seconds = DATEPART(SECOND, @diff_value) + 60
        * DATEPART(MINUTE, @diff_value) + 3600 * DATEPART(HOUR, @diff_value)

-- get the values that match the criteria
SELECT  *
FROM    #times
WHERE   val = DATEADD(SECOND, @diff_in_seconds, @special_time)
        OR val = DATEADD(SECOND, -( @diff_in_seconds ), @special_time)

DROP TABLE #times

Обратите внимание, что WHERE Предложение фильтрует результаты, складывая и вычитая разницу. Вычитание достигается путем @diff_in_seconds отрицательный.

Если мы правильно понимаем ваш вопрос, вы хотите, чтобы время, превышающее 20 минут от вашего (специального) времени.

Чтобы достичь этого, просто сделайте select с предложением where, которое содержит предложение, похожее на это: abs(datediff(minute, tableDate, @specialdate)) > 20

Пример SQLFiddle и пример кода:

declare @specialDate datetime = '1900-01-01 13:25:00'

select *
  from SampleData
 where abs(datediff(minute, SomeDate, @specialDate)) > 20

Обратите внимание, что я установил даты столбцов Datetime в 1900-01-01 в качестве неясного ориентира настройте в соответствии с вашими настройками.

Вам понадобится ABS в строке, чтобы убедиться, что оба варианта в результате datediff проверены (может вернуть 0, > 0 или < 0)

Рекомендации:
MSDN: DATEDIFF
MSDN: ABS

Вот решение:

create table t(t time);

insert into t
values
    ('12:45:24'),
    ('13:05:00'),
    ('13:50:30'),
    ('14:50:32'),
    ('15:15:10')

declare @st time = '13:25:00'
declare @dt time = '00:20:00'

select * from t
where abs(datediff(ss, t, @st)) - datediff(ss, '00:00:00', @dt) = 0

abs(datediff(ss, t, @st) будет держать разницу в секундах между временем в таблице и специальным временем. Вы сравниваете эту разницу с разницей между 00:00:00 и интервал datediff(ss, '00:00:00', @dt)

Выход:

t
13:05:00.0000000

Скрипка http://sqlfiddle.com/

Другие вопросы по тегам