Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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,我在sql查询中面临一个问题,下面是我尝试的解决方案: CREATE TABLE #EventTable(eStartDate datetime,eEndDate datetime) insert into #EventTable VALUES('2014-10-21 10:57:48.603','2014-10-22 10:57:48.603') insert into #EventTable VALUES('2014-10-23 10:57:48.603','2014-10-23 10:57

我在sql查询中面临一个问题,下面是我尝试的解决方案:

CREATE TABLE #EventTable(eStartDate datetime,eEndDate datetime)
insert into #EventTable VALUES('2014-10-21 10:57:48.603','2014-10-22 10:57:48.603')
insert into #EventTable VALUES('2014-10-23 10:57:48.603','2014-10-23 10:57:48.603')
insert into #EventTable VALUES('2014-10-25 10:57:48.603','2014-10-27 10:57:48.603')
insert into #EventTable VALUES('2014-10-28 10:57:48.603','2014-10-30 10:57:48.603')
insert into #EventTable VALUES('2014-10-31 10:57:48.603','2014-11-02 10:57:48.603')
第二桌

CREATE TABLE #NeedDateTable(StartDate datetime,EndDate datetime)
insert into #NeedDateTable VALUES('2014-10-22 10:57:48.603','2014-10-26 10:57:48.603')
insert into #NeedDateTable VALUES('2014-11-23 10:57:48.603','2014-11-23 10:57:48.603')
insert into #NeedDateTable VALUES('2014-11-02 10:57:48.603','2014-11-03 10:57:48.603')

SELECT * from #EventTable
SELECT * from #NeedDateTable
我想从NeedDateTable返回与EventTable重叠的日期。所以在我的例子中,它应该返回两个日期2014-10-22 10:57:48.603&&2014-10-26 10:57:48.603和 2014-11-02 10:57:48.603和2014-11-03 10:57:48.603

这是我的问题

SELECT Startdate , EndDate 
FROM #NeedDateTable a,#EventTable b  
WHERE ((a.Startdate <= b.eStartDate and b.eStartDate<= a.EndDate) 
OR (a.Startdate <= b.eEndDate and b.eEndDate <= a.EndDate)) 

它将返回上述日期的重复记录。你能帮我解决我的问题吗。

在你的查询中使用简单的中间语句

SELECT  Startdate,
        EndDate
    FROM    #NeedDateTable a cross join
            #EventTable b
    WHERE   a.Startdate BETWEEN b.eStartdate AND b.eEndDate
            OR a.EndDate BETWEEN b.eStartdate AND b.eEndDate

在查询中使用simplebetween语句

SELECT  Startdate,
        EndDate
    FROM    #NeedDateTable a cross join
            #EventTable b
    WHERE   a.Startdate BETWEEN b.eStartdate AND b.eEndDate
            OR a.EndDate BETWEEN b.eStartdate AND b.eEndDate
查询 查询
我在您的输出中看到,您需要具有StartDate=EventTable的eEndDate的NeedDateTable记录。如果是这种情况,则查询如下:

select a.* from NeedDateTable a join  EventTable b 
on a.StartDate = b.eEndDate;
或者,如果要返回NeedDateTable的记录,其中EventTable中存在一条estartdate或eenddate介于NeedDateTable的开始日期和结束日期之间的记录,则:

select * from NeedDateTable a 
where exists 
(
  select 1 from EventTable b 
  where (b.eStartDate between a.StartDate and a.EndDate) or
  (b.eEndDate between a.StartDate and a.EndDate)
);

我在您的输出中看到,您需要具有StartDate=EventTable的eEndDate的NeedDateTable记录。如果是这种情况,则查询如下:

select a.* from NeedDateTable a join  EventTable b 
on a.StartDate = b.eEndDate;
或者,如果要返回NeedDateTable的记录,其中EventTable中存在一条estartdate或eenddate介于NeedDateTable的开始日期和结束日期之间的记录,则:

select * from NeedDateTable a 
where exists 
(
  select 1 from EventTable b 
  where (b.eStartDate between a.StartDate and a.EndDate) or
  (b.eEndDate between a.StartDate and a.EndDate)
);

尝试将其添加到测试表中:

insert into #EventTable VALUES('2015-05-10','2015-05-10')
insert into #EventTable VALUES('2016-05-10','2016-05-13')
insert into #NeedDateTable VALUES('2015-05-10','2015-05-10')
insert into #NeedDateTable VALUES('2016-05-11','2016-05-12')
这两个例子将重叠,但其他答案目前无法识别其中一个重叠

以下是如何检测重叠:

SELECT * FROM #NeedDateTable a 
WHERE exists 
(
  SELECT null FROM #EventTable b 
  WHERE 
    a.StartDate <= b.eEndDate and
    a.EndDate >= b.eStartDate
);

尝试将其添加到测试表中:

insert into #EventTable VALUES('2015-05-10','2015-05-10')
insert into #EventTable VALUES('2016-05-10','2016-05-13')
insert into #NeedDateTable VALUES('2015-05-10','2015-05-10')
insert into #NeedDateTable VALUES('2016-05-11','2016-05-12')
这两个例子将重叠,但其他答案目前无法识别其中一个重叠

以下是如何检测重叠:

SELECT * FROM #NeedDateTable a 
WHERE exists 
(
  SELECT null FROM #EventTable b 
  WHERE 
    a.StartDate <= b.eEndDate and
    a.EndDate >= b.eStartDate
);

这不会识别所有可能的重叠,因为您似乎是正确的。where子句应该类似于“where a.StartDate在b.eStartDate和b.eEndDate之间,或a.EndDate在b.eStartDate和b.eEndDate之间”,因为我们需要在EventTable中查找重叠。这不会识别所有可能的重叠。看起来您是正确的。where子句应该类似于“where a.StartDate在b.eStartDate和b.eEndDate之间或a.EndDate在b.eStartDate和b.eEndDate之间”,因为我们需要在EventTable中查找重叠。