相交的日期

时间:2010-06-15 17:29:51

标签: sql

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

目前我正在使用Microsoft 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的日期 找到一天x不相交的日期

我找到了一个真正有用的网站 http://bloggingabout.net/blogs/egiardina/archive/2008/01/30/check-intersection-of-two-date-ranges-in-sql.aspx 但是输入要比较的日期,另一方面,我的所有日​​期都相交/不相交。

感谢大家的帮助。

2 个答案:

答案 0 :(得分: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'

我没有说明日期的完全匹配。决定如何处理这些,然后进行相应的调整。

答案 1 :(得分: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的主键字段 - 您希望防止日期范围重叠。)