簡體   English   中英

選擇日期不在多個日期范圍的表中的記錄SQL Server

[英]Select records where date not in table of multiple date ranges SQL Server

我在SQL Server中有一個表,其中包含各種日期范圍。

表格的開始日期和結束日期如下:

start_date                  end_date
=======================     =======================
2011-02-21 00:00:00.000     2011-02-25 00:00:00.000
2011-04-18 00:00:00.000     2011-04-29 00:00:00.000
2011-05-31 00:00:00.000     2011-06-03 00:00:00.000
2011-07-21 00:00:00.000     2011-08-31 00:00:00.000
2011-10-24 00:00:00.000     2011-10-28 00:00:00.000
2011-12-19 00:00:00.000     2012-01-02 00:00:00.000
2012-02-13 00:00:00.000     2012-02-17 00:00:00.000
2012-04-02 00:00:00.000     2012-04-13 00:00:00.000
2012-06-04 00:00:00.000     2012-06-08 00:00:00.000
2012-07-20 00:00:00.000     2012-08-31 00:00:00.000
2012-10-29 00:00:00.000     2012-11-02 00:00:00.000
2012-12-24 00:00:00.000     2013-01-01 00:00:00.000
2013-02-10 00:00:00.000     2013-02-16 00:00:00.000
2013-03-24 00:00:00.000     2013-04-06 00:00:00.000
2013-05-26 00:00:00.000     2013-06-01 00:00:00.000
2013-07-24 00:00:00.000     2013-08-31 00:00:00.000
2013-10-27 00:00:00.000     2013-11-02 00:00:00.000

我需要從另一個表中選擇記錄,而在上面的任何范圍中都不存在日期戳。

上表中的開始日期和結束日期可以相同,這表示僅排除一天。

我最初的想法是擴展上述范圍內的所有日期,然后執行“選擇不存在的選擇”,或者有沒有更有效的方法來實現這一點?

SELECT t.* 
FROM AnotherTable t 
WHERE NOT EXISTS(
    SELECT 1 
    FROM TblDate d 
    WHERE d.start_date <= t.DateColumn
    AND   d.end_date   >= t.DateColumn
)

編輯 :剛剛看到這是您的最初想法。 因此,我認為這是最簡單,最快的方法。 以下是有關此主題的一些內容:

http://sqlserverperformance.idera.com/tsql-optimization/finding-nonexistent-records-hurry/

您可以對范圍表進行左連接,並添加where子句以過濾掉所有匹配項。

SELECT anothertable.* FROM anothertable
LEFT JOIN range on anothertable.date >= range.start_date and anothertable.date <= range.end_date
WHERE range.start_date IS NULL

與(我認為)最終結果相同的情況相比,以下內容比您的建議更有效。 我唯一不確定的是,如果我了解您關於開始日期等於結束日期然后排除一整天的條件。

SELECT  *
FROM    Table1
        LEFT JOIN
        (   SELECT  Start_date, CASE WHEN End_Date = Start_Date THEN DATEADD(MILLISECOND, -1, DATEADD(DAY, 1, End_Date)) ELSE End_Date END [End_Date]
            FROM    table2
        ) Exc
            ON table.DateColumn BETWEEN Exc.Start_Date AND Exc.End_Date
WHERE   Exc.Start_Date IS NULL

您需要檢查2個條件:1.日期在范圍內2.日期與開始日期具有相同的日期,但比結束日期晚(不包含小時,分鍾和秒)

SELECT * FROM VALUE_TABLE
LEFT JOIN DATE_RANGE_TABLE ON 
  YEAR(VALUE_TABLE.CHECK_DATE) = YEAR(start_date)
  and MONTH (VALUE_TABLE.CHECK_DATE) = MONTH (start_date)
  AND DAY (VALUE_TABLE.CHECK_DATE) = DAY (start_date)
  OR VALUE_TABLE.CHECK_DATE BETWEEN start_date and end_date
WHERE start_date IS NULL
select * from anothertable
WHERE NOT EXISTS (SELECT 1 FROM range 
                   WHERE anothertable.date BETWEEN range.start_date AND range.end_date)

使用BETWEEN代替<= and >=

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM