Проверьте, находится ли целое число в следующих 5 приращениях в SQL, когда числа могут переноситься - PullRequest
0 голосов
/ 13 декабря 2018

Предположим, у меня есть диапазон чисел, от 0 до 59.

Мне нужно проверить, есть ли данные в индексе (в диапазоне) в следующих 5 приращениях.1003 *

Пример:

Если у меня индекс 57, а в 02 есть данные - мне нужно проверить 57 + 5, но чтобы он вернулся после 59, обратно в 0.

Есть ли способ достичь этого в SQL Server?

select * from Table1 where index between 57 and 02.

Выше приведено представление о том, что я пытаюсь сделать, но это просто проверка чисел от 02 до 57, а не переностак, как я собираюсь.

РЕДАКТИРОВАТЬ 1:

Представьте, что это секунды в минуту.И это значения в столбце с именем ID.

Если я хочу проверить строку в Таблице 1, находится ли значение в столбце ID между 57 секундами и 2 секундами, как бы мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Это должно делать то, что вы после, я думаю?

DECLARE @Start int;
SET @Start = 57;

WITH T AS(
    SELECT CASE (@Start + V.I) % 60 WHEN 0 THEN 60 ELSE (@Start + V.I) % 60 END AS I
    FROM (VALUES(0),(1),(2),(3),(4),(5)) V(I))
SELECT *
FROM YourTable YT
WHERE [Index] IN (SELECT I FROM T);
0 голосов
/ 13 декабря 2018

Вам не нужно делать отдельное сравнение для каждого идентификатора.Просто используйте арифметику:

where (index >= @idx and index <= @idx + 5) or
      (@idx + 5 >= 60 and index <= (@idx + 5) - 60)

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

0 голосов
/ 13 декабря 2018

Согласно комментарию, не очень ясно, что вы спрашиваете, но если @idx было 57, то это получило бы любые данные, которые были в 57, 58, 59, 00, 01 или 02 (ну, кроме того факта, что02 как число просто 2, поэтому, если index является буквально 02, то потребуется некоторая корректировка)

SELECT * FROM table WHERE index in (
  @idx, 
  (@idx+1)%60, 
  (@idx+2)%60, 
  (@idx+3)%60, 
  (@idx+4)%60,
  (@idx+5)%60
)

Настройте дополнения, если ваш индекс 1 - 60 вместо 0 -59. Это проще всего сделать, подставив 1 из индекса, чтобы оно стало 0-59 вместо 1-60:

SELECT * FROM table WHERE index-1 in (
  @idx, 
  (@idx+1)%60, 
  (@idx+2)%60, 
  (@idx+3)%60, 
  (@idx+4)%60,
  (@idx+5)%60
)

В принципе, помните, что оператор мода всегда возвращает число от 0 до единицы меньшеделитель, поэтому x % 1000 гарантированно вернется между 0 и 999 (включительно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...