Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
子查询中两个日期之间的SQL查询_Sql_Sql Server - Fatal编程技术网

子查询中两个日期之间的SQL查询

子查询中两个日期之间的SQL查询,sql,sql-server,Sql,Sql Server,我必须通过子查询中的两列来过滤结果,所以我必须像下面这样连接它们,这很好 select * from EDM_STATUS_REPORT_DATA LEFT JOIN ( Select DocumentID, LogDate From [LM_StateEvents] Where 1=1 ) table2 ON EDM_STATUS_REPORT_DATA.LLObjID=table2.DocumentID AND EDM_STATUS_REPORT_DATA

我必须通过子查询中的两列来过滤结果,所以我必须像下面这样连接它们,这很好

select * from EDM_STATUS_REPORT_DATA LEFT JOIN 
(
   Select DocumentID, LogDate
   From [LM_StateEvents]
   Where 1=1

) table2
ON 
   EDM_STATUS_REPORT_DATA.LLObjID=table2.DocumentID
   AND EDM_STATUS_REPORT_DATA.StatusDate = table2.LogDate 
WHERE table2.DocumentID IS NOT NULL
但是,主查询中的
EDM\u STATUS\u REPORT\u DATA.StatusDate
与子查询中的值不同。它的最大差值为+5秒。因此,我必须在
table2.LogDate
table2.LogDate+5秒之间进行搜索

我怎样才能做到这一点

下面是示例数据和预期输出


我想您需要交叉应用

select srd.*, le.*
from EDM_STATUS_REPORT_DATA src cross apply
     (Select DocumentID, LogDate
      From LM_StateEvents le
      where le.LLObjID = srd.DocumentID and
            le.LogDate  = src.StatusDate 
     ) le
where le.DocumentID is not null;

注意:您的outer
where
子句表明您需要匹配。我想知道您为什么在这种情况下使用外部联接。

我想您需要交叉应用

select srd.*, le.*
from EDM_STATUS_REPORT_DATA src cross apply
     (Select DocumentID, LogDate
      From LM_StateEvents le
      where le.LLObjID = srd.DocumentID and
            le.LogDate  = src.StatusDate 
     ) le
where le.DocumentID is not null;

注意:您的outer
where
子句表明您需要匹配。我想知道您为什么在这种情况下使用外部联接。

您可以在此处看到此答案以向日期添加秒数(使用DateADD函数):

您可以在此处看到此答案以向日期添加秒数(使用DateADD函数):

您可以使用
DATEDIFF
确保差异不超过5秒:

select * from EDM_STATUS_REPORT_DATA LEFT JOIN 
(
   Select DocumentID, LogDate
   From [LM_StateEvents]
   Where 1=1

) table2
ON 
   EDM_STATUS_REPORT_DATA.LLObjID=table2.DocumentID
   AND DATEDIFF(second,EDM_STATUS_REPORT_DATA.StatusDate,table2.LogDate) between -5 and 5
WHERE table2.DocumentID IS NOT NULL

您可以使用
DATEDIFF
确保差异不超过5秒:

select * from EDM_STATUS_REPORT_DATA LEFT JOIN 
(
   Select DocumentID, LogDate
   From [LM_StateEvents]
   Where 1=1

) table2
ON 
   EDM_STATUS_REPORT_DATA.LLObjID=table2.DocumentID
   AND DATEDIFF(second,EDM_STATUS_REPORT_DATA.StatusDate,table2.LogDate) between -5 and 5
WHERE table2.DocumentID IS NOT NULL

通过连接到表,而不是创建子查询并连接到该表,可以大大简化这一过程。此外,您应该使用内部联接而不是左联接,因为where谓词正在将其更改为内部联接。我不允许在连接谓词中使用这样的函数,因为它们是不可争论的。您可能应该修改设计,这样就不必这样做。但是考虑到当前的表,您可以这样做

select * 
from EDM_STATUS_REPORT_DATA  rd
JOIN LM_StateEvents se on rd.LLObjID = se.DocumentID
   AND abs(datediff(second, rd.StatusDate = se.LogDate)) <= 5
选择*
来自EDM\u状态报告\u数据rd
在rd.LLObjID=se.DocumentID上加入LM_StateEvents se

和abs(datediff(second,rd.StatusDate=se.LogDate))通过连接到表,而不是创建子查询并连接到该表,可以大大简化此过程。此外,您应该使用内部联接而不是左联接,因为where谓词正在将其更改为内部联接。我不允许在连接谓词中使用这样的函数,因为它们是不可争论的。您可能应该修改设计,这样就不必这样做。但是考虑到当前的表,您可以这样做

select * 
from EDM_STATUS_REPORT_DATA  rd
JOIN LM_StateEvents se on rd.LLObjID = se.DocumentID
   AND abs(datediff(second, rd.StatusDate = se.LogDate)) <= 5
选择*
来自EDM\u状态报告\u数据rd
在rd.LLObjID=se.DocumentID上加入LM_StateEvents se

和abs(datediff(second,rd.StatusDate=se.LogDate))请提供示例数据和预期结果。为什么要加入子查询而不是表?为什么还要麻烦1=1??@GordonLinoff用示例数据和所需结果更新。@SeanLange 1=1只是一个占位符,用于放置实际的where条件。请提供示例数据和所需结果。为什么要加入子查询而不是表?为什么还要麻烦1=1??@GordonLinoff更新了样本数据和期望的结果。@SeanLange 1=1只是一个占位符,用来放置实际的where条件。此横向连接相当于
内部连接
。所以,不需要过滤器。此横向连接相当于
内部连接
。因此,不需要过滤器。