2010-06-15 51 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