Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL-找到范围内的最小值_Sql_Sql Server_Tsql - Fatal编程技术网

TSQL-找到范围内的最小值

TSQL-找到范围内的最小值,sql,sql-server,tsql,Sql,Sql Server,Tsql,编辑: 问题陈述: 选择3月初至5月底之间的所有SIIIS和SULLS数据 对于SIIIS中的每个“XFFF”,在SULLS中的“XFFF”中查找任何匹配项,其中SULLS中的“开始时间”在SIIIS中的“案例创建”之后,并且“开始时间”和“案例创建”之间的时间差小于3小时。 选择时间差最小的匹配项 select si.XFFF xfff, DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) diffInhours from siiis si

编辑: 问题陈述: 选择3月初至5月底之间的所有SIIIS和SULLS数据

对于SIIIS中的每个“XFFF”,在SULLS中的“XFFF”中查找任何匹配项,其中SULLS中的“开始时间”在SIIIS中的“案例创建”之后,并且“开始时间”和“案例创建”之间的时间差小于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)

试试这个代码。基本上,它应该做的是按DATEDIFFhour、si.CASE\u CREATE、su.START\u TIME的升序排序,然后选择第一个1。它没有经过测试,所以我解释了逻辑

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

试图清理和修复您的代码,如果在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

较好的如果你把你的问题也包括进去,我就只得到一张记录。但是当有多条记录时,我需要一条记录。你是说你想以最小的差异显示所有记录?看起来你的解决方案可行,你是冠军。但是我不明白你的代码:@coolcake除非你需要更多的信息,如果你接受这个作为答案,我将不胜感激