让我们假设我有一个数字范围,从0到59。
我需要检查在任何给定的数字上,在接下来的5个增量内的索引(在范围内(是否有数据。
示例:
如果我在索引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秒之间,我将如何实现这一点?
根据注释,不太清楚你在问什么,但如果@idx是57,那么这将得到57、58、59、00、01或02的任何数据(好吧,除了02作为数字只是2
这一事实之外,所以如果index是字面上02
的varchar,则需要进行一些调整(
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
)
基本上,请记住,mod运算符总是返回一个比除数小0到1之间的数字,因此x % 1000
保证返回0到999(包括999(
我想这应该是你想要的吗?
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);
您不必对每个id进行单独的比较。只需使用算术:
where (index >= @idx and index <= @idx + 5) or
(@idx + 5 >= 60 and index <= (@idx + 5) - 60)
这个表达式的方便之处在于,它适用于任何范围的值,而不必扩展表达式。