當我提供從和到日期時,我想回傳所有當前正在旅行的旅行者。這意味著,如果我從2022 年1 月 1 日到 2022年1 月10 日旅行,并且我提供的起始日期為2022 年 1 月5 日和截止日期為2022 年1 月 15 日,我必須重新調整,因為我在那段時間旅行。所以在我下面的代碼中必須回傳 Mike。
DECLARE @DateFrom DATE = '2022-01-05',
@DateTo DATE = '2022-01-15'
DROP TABLE IF EXISTS #Dates
CREATE TABLE #Dates
(
DepartureDate Date NULL,
ReturnDate Date NULL,
Name VARCHAR(8) NULL
)
INSERT INTO #Dates (DepartureDate, ReturnDate, Name)
VALUES ('2022-01-01', '2022-01-10', 'Mike' )
SELECT *
FROM #Dates
WHERE DepartureDate >= @DateFrom
AND ReturnDate <= @DateTo
如果您選擇“2021-12-01”和“2021-12-05”之間的日期范圍,則邁克沒有旅行,因此不應回傳。但是,如果您選擇“2022-01-05”和“2022-01-15”之間的日期范圍,那么應該回傳 Mike,因為 Mike 確實在該日期范圍內旅行,即使他沒有整天旅行。
uj5u.com熱心網友回復:
我猜你的問題是你的WHERE條款不適用于所有情況來支持你的問題描述。
這是您可以撰寫它來修復它的一種方法:
SELECT *
FROM #Dates
WHERE
(DepartureDate >= @DateFrom AND ReturnDate <= @DateTo) -- Traveled only between provided date range
OR (DepartureDate < @DateFrom AND ReturnDate > @DateTo) -- Traveled the entire date range, possibly longer
OR (DepartureDate < @DateFrom AND ReturnDate <= @DateTo AND ReturnDate >= @DateFrom) -- Started traveling before date range but finished traveling within it
OR (DepartureDate >= @DateFrom AND DepartureDate <= @DateTo AND ReturnDate > @DateTo) -- Started traveling within the date range but finished traveling after
請參閱每個案例的評論。
或者,您也可以將其寫成 4條SELECT陳述句(每種情況一個)和一個UNION ALL子句。OR有時,與使用多個謂詞相比,以這種方式撰寫查詢時,SQL Server 引擎會生成更高效的查詢計劃:
-- Traveled only between provided date range
SELECT *
FROM #Dates
WHERE
DepartureDate >= @DateFrom
AND ReturnDate <= @DateTo
UNION ALL
-- Traveled the entire date range, possibly longer
SELECT *
FROM #Dates
WHERE
DepartureDate < @DateFrom
AND ReturnDate > @DateTo
UNION ALL
-- Started traveling before date range but finished traveling within it
SELECT *
FROM #Dates
WHERE
DepartureDate < @DateFrom
AND ReturnDate <= @DateTo
AND ReturnDate >= @DateFrom
UNION ALL
-- Started traveling within the date range but finished traveling after
SELECT *
FROM #Dates
WHERE
DepartureDate >= @DateFrom
AND DepartureDate <= @DateTo
AND ReturnDate > @DateTo
您必須測驗這兩種方法,以查看哪種方法更適合您的特定情況。
旁注,不要使用SELECT *,因為它是一個反模式。相反,您應該只明確列出查詢需要的列。
uj5u.com熱心網友回復:
重疊區間問題!檢查每個間隔是否在另一個間隔結束之前開始:
SELECT *
FROM #Dates
WHERE DepartureDate <= @DateTo
AND ReturnDate >= @DateFrom
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/535477.html
上一篇:FolderBrowserDialog拆分vs2019到vs2010
下一篇:查詢過去n天的分組依據
