t-sql:给定数字下降的返回范围

时间:2011-02-22 11:51:50

标签: 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 #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

...但在我看来,范围应该能够从给定的数字本身确定,并且我不应该需要(冗余的)参考表(或者,就此而言,一个函数)对此。

在我看来,我应该能够用一点脑力来解决这个问题,除了我今天晚上连续喝了两瓶啤酒......

4 个答案:

答案 0 :(得分:2)

另一种方式;

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

答案 1 :(得分:1)

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

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)

答案 2 :(得分:0)

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

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

1000年至1999年

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

答案 3 :(得分:0)

declare @range int;
set @range = 1000;
select replace(str(st,4),' ','0') + '-' +
       replace(str(st + @range,4),' ','0') as TheStringIWant
from (
  select st = v / @range * @range
  from (select v = 1234) s
) s