Sql server 2005 t-sql:给定数字的返回范围

Sql server 2005 t-sql:给定数字的返回范围,sql-server-2005,tsql,Sql Server 2005,Tsql,我正试图找到一种好方法来返回给定数字所在范围的字符串“name”。范围是1000的范围,因此第一个范围是“0000-0999”,第二个范围是“1000-1999”,等等。例如,给定数字1234,我想返回文本字符串'1000-1999' 在我看来,我可以用这些范围来维护一个参考表,如下所示 --create & populate temp table with ranges create table #ranges (st int,en int) go insert into #range

我正试图找到一种好方法来返回给定数字所在范围的字符串“name”。范围是1000的范围,因此第一个范围是“0000-0999”,第二个范围是“1000-1999”,等等。例如,给定数字1234,我想返回文本字符串
'1000-1999'

在我看来,我可以用这些范围来维护一个参考表,如下所示

--create & populate temp table with ranges
create table #ranges (st int,en int)
go
insert into #ranges values(0,999)
insert into #ranges values(1000,1999)
insert into #ranges values(2000,2999)
go

--example query
select replace(str(st,4),' ','0') + '-' + replace(str(en,4),' ','0') as TheStringIWant
from #ranges 
where 1234 between st and en
…但在我看来,范围应该能够从给定的数字本身确定,而且我不应该仅仅为此而需要(冗余的)引用表(或者,就此而言,一个函数)


在我看来,我应该能够用一点脑力来解决这个问题,只是今晚我刚刚连续喝了两杯啤酒……

你可以使用数学函数来避免使用临时表:

SELECT 1234, 
RIGHT('0000' + CAST(FLOOR(1234/1000.0) * 1000 AS VARCHAR(11)),4)
+ '-'
+ RIGHT('0000' + CAST( (FLOOR(1234/1000.0) * 1000) + 999 AS VARCHAR(11)),4)

您可以使用数学函数来避免使用临时表:

SELECT 1234, 
RIGHT('0000' + CAST(FLOOR(1234/1000.0) * 1000 AS VARCHAR(11)),4)
+ '-'
+ RIGHT('0000' + CAST( (FLOOR(1234/1000.0) * 1000) + 999 AS VARCHAR(11)),4)

在shell中,我可以使用整数运算来截断234,并使用一个简单的公式计算字符串,但是它不会生成0000-0999,而是为前1000个生成0-999

v=1234
echo $(((v/1000)*1000))-$(((v/1000)*1000+999))
1000-1999


我不知道如何使它适应tsql——是否可能

在shell中,我可以使用整数算法截断234,并用一个简单的公式计算字符串,但是它不会生成0000-0999,而是为前1000个生成0-999

v=1234
echo $(((v/1000)*1000))-$(((v/1000)*1000+999))
1000-1999

我不知道如何使它适应tsql——是否可能

另一种方式

select case when value / 1000 < 1 
    then '0000-0999' 
    else cast(value / 1000 * 1000 as varchar(16)) + '-' + cast(value / 1000 * 1000 + 999 as varchar(16)) 
end
当值/1000<1时选择大小写
然后是“0000-0999”
else cast(值/1000*1000为varchar(16))+'-'+cast(值/1000*1000+999为varchar(16))
结束
另一种方式

select case when value / 1000 < 1 
    then '0000-0999' 
    else cast(value / 1000 * 1000 as varchar(16)) + '-' + cast(value / 1000 * 1000 + 999 as varchar(16)) 
end
当值/1000<1时选择大小写
然后是“0000-0999”
else cast(值/1000*1000为varchar(16))+'-'+cast(值/1000*1000+999为varchar(16))
结束