Sql 如何将一个表中的日期与另一个表中的日期进行比较
我在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
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中查找重叠。