2010-06-15 50 views
3

我一直在研究这个问题一段时间了,我似乎无法找到解决方案,希望这里有人可以提供帮助。交叉的日期

目前我正在与微软SQL服务器的管理工作,我一直在努力做到以下几点:

以前,旧的查询将只返回适合两个日期 继承人的以前的查询的结果:在所述查询后产生

SELECT e.Name, o.StartDate, o.EndDate 
FROM dbo.Name e, dbo.Date o 
WHERE 
where e.Name = o.Name 
and o.StartDate <= '2010-09-28 23:59:59' 
and o.EndDate >= '2010-9-28 00:00:00' 
and e.Name like 'A' 

实施例表运行(真正的表具有明显更大量的行:P):

Name Start     End 
A  2010-09-28 07:00:00  2010-09-28 17:00:00 
A  2010-09-28 13:45:00  2010-09-28 18:00:00 
A  2010-09-28 08:00:00  2010-09-28 16:00:00 
A  2010-09-28 07:00:00  2010-09-28 15:30:00 

但是我们需要改变这一点,以便查询执行以下操作:

发现相交的天× 日期查找不相交的一天的日期X

我发现一个真正有用的网站 http://bloggingabout.net/blogs/egiardina/archive/2008/01/30/check-intersection-of-two-date-ranges-in-sql.aspx 然而,输入比较日期,我的另一方面必须相交/不相交的所有日期。

感谢大家的帮助。

回答

2

日期相交:

SELECT 
    E.name, 
    O.start_date, 
    O.end_date 
FROM 
    dbo.Names E 
INNER JOIN dbo.Dates O ON 
    O.name = E.name AND 
    O.start_date < @end_date AND 
    O.end_date > @start_date 
WHERE 
    E.name LIKE 'A' 

日期是不相交的仅仅是相对于逆日期:

SELECT 
    E.name, 
    O.start_date, 
    O.end_date 
FROM 
    dbo.Names E 
INNER JOIN dbo.Dates O ON 
    O.name = E.name AND 
    (O.start_date > @end_date OR 
    O.end_date < @start_date) 
WHERE 
    E.name LIKE 'A' 

我没有考虑日期的精确匹配。决定如何处理这些问题,然后进行相应调整。

+0

非常感谢你的朋友,这真的很有帮助,但很简单 – ChickSentMeHighE 2010-06-16 14:17:12

2

尝试以下操作:

SELECT e.Name, o.StartDate, o.EndDate 
FROM dbo.Name e, dbo.Date o 
WHERE 
where e.Name = o.Name 
and o.StartDate <= '2010-09-28 23:59:59' 
and o.EndDate >= '2010-09-28 00:00:00' 
and exists 
(select null from dbo.Date o2 
where o.Name = o2.Name and 
o.StartDate <= o2.EndDate and 
o.EndDate >= o2.StartDate and 
o.ID <> o2.ID) 

相交日期;改变..并且存在...到...并且不存在...用于非相交日期。 (我认为dbo.Date有一个名为ID的主键字段 - 你想防止日期范围重叠自己。)

+0

感谢您的替代解决方案! – ChickSentMeHighE 2010-06-16 14:17:27