2017-05-12 130 views
0

我有兩個表相互關聯[t1] & [t2]有兩列:[id] & [日期]。我希望從[t1](其中沒有[t2]。[日期]或MIN([t1]。[日期])之前一年)檢索[id]和[日期]。日期範圍不在兩個日期從另一個表

基本上排除[t2]。[日期](任何日期發生 - 動態)'或最早[t1]。[日期]之前一年的[id] s。在MIN([t1]。[日期])一年之前的任何[t2]。[id] s都可以,並且MIN([t1]。[日期])之後的任何[t2]。[id]好。如果任何[t2]。[日期]值落在一年範圍內,則應將[id]從返回的數據中排除。

概念我想是這樣的:

SELECT [id] 
FROM [t1] 
WHERE [t2].[date] NOT BETWEEN DATEADD(YEAR, -1, [t1].[date]) AND [t1].[date] 

但我與如何處理這個掙扎;使用JOIN/UNION,DECLARE變量,WHERE子句。任何幫助,將不勝感激!謝謝!

/* Adding this new information below: */ 

我喜歡斯科特的迴應;然而,我認爲我原來並不認爲我的「概念代碼」足夠一致。我想我正在尋找更像這樣的東西,但我返回一個錯誤(聚合可能不會出現在WHERE子句中,除非它位於包含在HAVING子句或選擇列表中的子查詢中,並且聚合的列是一個外部參考。):

SELECT [id] 
FROM [t1] 
WHERE NOT EXISTS 
    (SELECT * FROM [t2] WHERE [t2].[date] 
    BETWEEN DATEADD(YEAR, -1, MIN([t1].[date])) AND MIN([t1].[date])) 

/* Adding this new information below: */ 

我相信我已經找到了原始查詢的解決方案。如果你喜歡它,請給出'向上箭頭'!

SELECT DISTINCT [t1].[id] 
FROM [t1] 
WHERE NOT EXISTS (SELECT 1 
        FROM [t2] 
        WHERE [t2].[id] = [t1].[id] 
        AND [t2].[date] BETWEEN DATEADD(dd, -365, [t1].[date]) 
              AND [t1].[date]) 
+0

我只想離開這個位置... HTTP://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do -between-and-the-devil-have-in-common.aspx –

回答

1

WHERE日期<起始日期或日期>結束日期

3

這是一個工作不存在!

SELECT [id] 
FROM [t1] 
WHERE NOT EXISTS (SELECT * FROM [t2] 
        WHERE [t2].[date] BETWEEN DATEADD(YEAR, -1, [t1].[date]) AND [t1].[date]) 

更新來比較敏(T1.Date):

我不熟悉sqlserver的 - 甲骨文公司已經分析的功能,這使得這麼多鐵道部簡單。你也許可以做到這一點只用像這樣子查詢:

SELECT [id] 
FROM (SELECT [id], min([date] AS minDate from [t1] GROUP BY [id]) AS t1_min 
WHERE NOT EXISTS (SELECT * FROM [t2] 
        WHERE [t2].[date] BETWEEN DATEADD(YEAR, -1, [t1_min].[minDate]) AND [t1_min].[minDate]) 
+0

我喜歡這樣,但是可以將它應用到從t1開始的MIN日期範圍 – DataMan31

相關問題