我试图想出一个很好的方法来返回给定数字落在范围内的字符串'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
...但在我看来,范围应该能够从给定的数字本身确定,并且我不应该需要(冗余的)参考表(或者,就此而言,一个函数)对此。
在我看来,我应该能够用一点脑力来解决这个问题,除了我今天晚上连续喝了两瓶啤酒......
答案 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