SQL选择靠近值

时间:2015-07-05 13:10:33

标签: sql

我有一个表“T_Person”,其中包含2个我想要搜索的字段:Height int, BirthDate datetime

当我查询这个表时,我希望得到的值的值接近我搜索的值。例如,当我搜索身高175厘米的人时,就像这样:

Select * 
from T_Person 
where Height = 175

我还希望获得高度值接近175的行。例如174,173,176 ......

关于日期列的相同事项。当我搜索'2003-06-25'时,我想获得接近它的日期。

有可能吗?

5 个答案:

答案 0 :(得分:3)

你需要某种程度的衡量标准。我还怀疑你希望首先出现完全匹配。因此,按照" nearness"来排序行。使用方法:

select p.*
from t_person p
order by abs(height - 175);

过滤结果很有用,因此您还可以添加where子句:

select p.*
from t_person p
where height between 175 - 2 and 175 + 2
order by abs(height - 175);

同样的想法适用于约会。但是,您没有在问题中指定数据库,日期函数具有高度数据库特定性。

答案 1 :(得分:1)

更改过滤器:

 Select * from T_Person where Height >= 173 and Height <= 177

或者:

  Select * from T_Person where Height between 173 and 177

对于datetime字段,您应该使用cast()函数来获得最佳效果:

  Select * from T_Person where BirthDate  
     between CAST('2014-02-28' AS DATETIME) and CAST('2015-02-28' AS DATETIME); 

答案 2 :(得分:0)

将175替换为您需要的值。使用此

Select * from T_Person where Height between 175 - 2 and 175 + 1

答案 3 :(得分:0)

为了获得合格的结果,您需要定义评分函数。它可以像这样简单地总结差异:

select * from t_person  
order by abs(height - 175) + abs(datediff(date, '2003-06-25')) asc

此查询将为您提供按天数和天数差异排序的所有人员。

答案 4 :(得分:0)

首先定义你的界限, near 对你意味着什么:

declare 
@h1 int = -2, -- height diff lower bound (cm)
@h2 int = 1, -- height diff upper bound (cm)
@d1 int = -100, -- birthdate diff lower bound (days)
@d2 int = 30,  -- birthdate diff upper bound (days)

接下来设置你要找的东西:

declare 
@hr int = 181,  -- reference height (cm)
@dr date = '1971-09-24'  -- referencde birthdate

最后提取你的记录

select * 
from (
    select t.*, (t.Height - @hr) diff_cm, DATEDIFF(DAY, @dr, t.BirthDate) diff_days
    from T_Person t
    where t.Height between @hr+@h1 and @hr+@h2
    and DATEDIFF(DAY, @dr, t.BirthDate) between @d1 and @d2
) t

最终根据需要选择排名顺序..

order by abs(diff_cm) -- only height
order by abs(diff_days) -- only birthdate
order by abs(diff_cm)*30 + abs(diff_days) -- a mix of both..

希望这个帮助