2013-08-01 59 views
1

编辑: 问题陈述: 在SIIIS选择三月开始和结束的五月TSQL - 查找范围中的最小

之间所有SIIIS和SULLS数据对于每个“XFFF”寻找在“XFFF任何匹配“在SULLS中,SULLS中的”Start_Time“在SIIIS中的”Case_Create“之后,并且”Start_Time“和”Case_Create“之间的时间差小于3小时。 选择最小时差的比赛

select 
si.XFFF xfff,  
DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) diffInhours 
from siiis si inner join sulls su on si.xfff= su.xfff 
where 
((si.CASE_CREATE BETWEEN '20130301' AND '20130531') and (su.START_TIME between '20130301'AND '20130531')) 
and 
(su.START_TIME > si.CASE_CREATE) and 
(DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) < 3 and DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) > 0) 
+1

更好..如果你还包括你的问题。 – Ravi

回答

0

试图清理和修复你的代码,应该SQLSERVER 2008+运行,DATEDIFF不会给你时间差(很常见的误解),所以我采取了不同的方法:

select 
si.num_phone Phone, 
su.start_time sulstarrtTime , 
si.CASE_CREATE siStartTime, 
datediff(hour, 0, su.START_TIME - si.CASE_CREATE) diffInhours 
from siiis si 
cross apply 
(select top 1 * from sulls su 
where 
si.xfff= su.xfff 
and su.START_TIME > si.CASE_CREATE 
-- less than 3 hours difference 
and dateadd(hour, 3, si.CASE_CREATE) > su.START_TIME 
-- more than 1 hour difference your code indicated you needed this, your text said otherwise 
--and dateadd(hour, 1, si.CASE_CREATE) <= su.START_TIME 
order by START_TIME 
) su 
WHERE si.CASE_CREATE BETWEEN '20130301' AND '20130531' -- you are not including all of may 
+1

看起来像你的解决方案的作品,你是一个冠军。但我不明白你的代码:( – coolcake

+0

@coolcake,除非你需要更多的信息,我会appriciate如果你接受这个答案 –

0

试试这段代码。基本上它应该做的是它按照DATEDIFF(hour, si.CASE_CREATE, su.START_TIME)的顺序从小到大排列,然后选择第一个。它没有测试,所以我解释了逻辑。

SELECT TOP 1 
si.num_phone Phone, 
su.start_time sulstarrtTime , 
si.CASE_CREATE siStartTime, 
DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) diffInhours 
from siiis si inner join sulls su on si.num_phone = su.num_phone 
where 
((si.CASE_CREATE BETWEEN '20130301' AND '20130531') and (su.START_TIME between '20130301'AND '20130531')) 
and 
(su.START_TIME > si.CASE_CREATE) and 
(DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) < 3 and DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) > 0) 
order by DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) ASC 
+0

它给我一条记录。但是当有多条记录时,我需要一条记录。 – coolcake

+0

你的意思是你想显示所有记录的最小差异? –

+0

所有记录 – coolcake