我有一个表“T_Person
”,其中包含2个我想要搜索的字段:Height int, BirthDate datetime
。
当我查询这个表时,我希望得到的值的值接近我搜索的值。例如,当我搜索身高175厘米的人时,就像这样:
Select *
from T_Person
where Height = 175
我还希望获得高度值接近175的行。例如174,173,176 ......
关于日期列的相同事项。当我搜索'2003-06-25'时,我想获得接近它的日期。
有可能吗?
答案 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..
希望这个帮助