在SQL中,当数字可以换行时,请检查整数是否在接下来的5个增量内



让我们假设我有一个数字范围,从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)

这个表达式的方便之处在于,它适用于任何范围的值,而不必扩展表达式。

相关内容

最新更新