Фильтровать значения времени, которые являются установленным периодом по обе стороны от указанного времени
Учитывая заданное значение времени и значение интервала:
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/