我有以下資料:
DECLARE @tbl TABLE (
Id INT,
[Date_1] DATETIME2,
[Date_2] DATETIME2
)
INSERT INTO @tbl ([Id], [Date_1], [Date_2]) VALUES
(1, '2018-08-15 16:05:20.000', NULL),
(2, '2018-08-15 16:05:20.000', NULL),
(3, '2018-08-15 16:05:20.000', NULL),
(4, '2018-08-20 00:00:00.000', NULL),
(5, NULL, NULL),
(6, '2018-08-30 14:02:08.000', '2018-09-05 12:31:30.530')
我有一個完美適用于各種條件的查詢:
SELECT *
FROM @tbl AS t
WHERE
(ISNULL(t.[Date_1], '1900-1-1') BETWEEN @DateFrom AND @DateTo) OR
(ISNULL(t.[Date_2], '1900-1-1') BETWEEN @DateFrom AND @DateTo)
第一種情況。
DECLARE @DateFrom DATE = '1900-01-01', @DateTo DATE = '9999-12-30' -- result one. The overall count is 6 rows
結果將是:

第二種情況。如果我改變@DateFrom并且@DateTo:
DECLARE @DateFrom DATE = '2018-08-15', @DateTo DATE = '2018-08-16' -- result two. The overall count is 3 rows
那么結果將是:

第三種情況。如果我改變@DateFrom并且@DateTo:
DECLARE @DateFrom DATE = '2018-09-05', @DateTo DATE = '2018-09-06' -- result three. The overall count is 1 row
那么結果將是:

我的問題是如何ISNULL從WHERE 宣告中排除?我嘗試了不同的方法,但它們給了我不正確的結果:
SELECT *
FROM @tbl AS t
WHERE
((t.[Date_1] IS NOT NULL AND t.[Date_1] BETWEEN @DateFrom
AND @DateTo) OR t.[Date_1] IS NULL) OR
((t.[Date_2] IS NOT NULL AND t.[Date_2] BETWEEN @DateFrom
AND @DateTo) OR t.[Date_2] IS NULL)
任何幫助將不勝感激。我無法設定@DateFrom和@DateTo。NULL
uj5u.com熱心網友回復:
首先,BETWEEN用于比較日期時間資料型別是不正確的。例如,您的原始查詢不允許您選擇所有2018-08-15日期,但排除2018-08-16 00:00:00.
其次,您似乎想要一個“全能”查詢。
我會使用以下 WHERE 子句:
WHERE Date_1 >= @DateFrom AND Date_1 < @DateTo
OR Date_2 >= @DateFrom AND Date_2 < @DateTo
OR @DateFrom IS NULL AND @DateTo IS NULL
然后按如下方式設定值:
-- catch all
SET @DateFrom = NULL
SET @DateTo = NULL
-- all dates between 2018-08-15 00:00 and 2018-08-15 23:59:59.9999999
SET @DateFrom = '2018-08-15'
SET @DateTo = '2018-08-16'
-- all dates between 2018-09-05 00:00 and 2018-09-05 23:59:59.9999999
SET @DateFrom = '2018-09-05'
SET @DateTo = '2018-09-06'
uj5u.com熱心網友回復:
當 (@DateFrom, @DateTo) 是最小和最大日期文字時,您似乎只想要所有記錄。
然后這個查詢回傳那個。
SELECT *
FROM @tbl AS t
WHERE ( (t.[Date_1] >= @DateFrom AND t.[Date_1] < DATEADD(day,1,@DateTo))
OR (t.[Date_2] >= @DateFrom AND t.[Date_2] < DATEADD(day,1,@DateTo))
OR (@DateFrom <= '1900-01-01' AND @DateTo >= '9999-01-01')
);
BETWEEN由于 Date_1 和 Date_2 不是DATE型別,因此已替換。
演示
DECLARE @tbl TABLE ( Id int, [Date_1] DateTime2, [Date_2] DateTime2 ) Insert Into @tbl ([Id],[Date_1],[Date_2]) Values (1, '2018-08-15 16:05:20.000', NULL) , (2, '2018-08-15 16:05:20.000', NULL) , (3, '2018-08-15 16:05:20.000', NULL) , (4, '2018-08-20 00:00:00.000', NULL) , (5, NULL,NULL) , (6, '2018-08-30 14:02:08.000', '2018-09-05 12:31:30.530'); DECLARE @DateFrom DATE, @DateTo DATE; SELECT @DateFrom = '1900-01-01', @DateTo = '9999-12-30'; -- result 1. The overall count is 6 rows SELECT * FROM @tbl AS t WHERE ( (t.[Date_1] >= @DateFrom AND t.[Date_1] < DATEADD(day,1,@DateTo)) OR (t.[Date_2] >= @DateFrom AND t.[Date_2] < DATEADD(day,1,@DateTo)) OR (@DateFrom <= '1900-01-01' AND @DateTo >= '9999-01-01') ); SELECT @DateFrom = '2018-08-15', @DateTo = '2018-08-16'; -- result two. The overall count is 3 rows SELECT * FROM @tbl AS t WHERE ( (t.[Date_1] >= @DateFrom AND t.[Date_1] < DATEADD(day,1,@DateTo)) OR (t.[Date_2] >= @DateFrom AND t.[Date_2] < DATEADD(day,1,@DateTo)) OR (@DateFrom <= '1900-01-01' AND @DateTo >= '9999-01-01') ); SET @DateFrom = '2018-09-05'; SET @DateTo = '2018-09-06'; -- result three. The overall count is 1 row SELECT * FROM @tbl AS t WHERE ( (t.[Date_1] >= @DateFrom AND t.[Date_1] < DATEADD(day,1,@DateTo)) OR (t.[Date_2] >= @DateFrom AND t.[Date_2] < DATEADD(day,1,@DateTo)) OR (@DateFrom <= '1900-01-01' AND @DateTo >= '9999-01-01') ); GO身份證 | 日期_1 | 日期_2 -: | :---------------------------- | :---------------------------- 1 | 2018-08-15 16:05:20.0000000 | 空 2 | 2018-08-15 16:05:20.0000000 | 空 3 | 2018-08-15 16:05:20.0000000 | 空 4 | 2018-08-20 00:00:00.0000000 | 空 5 | 空 | 空值 6 | 2018-08-30 14:02:08.0000000 | 2018-09-05 12:31:30.5300000 身份證 | 日期_1 | 日期_2 -: | :---------------------------- | :----- 1 | 2018-08-15 16:05:20.0000000 | 空 2 | 2018-08-15 16:05:20.0000000 | 空 3 | 2018-08-15 16:05:20.0000000 | 空值 身份證 | 日期_1 | 日期_2 -: | :---------------------------- | :---------------------------- 6 | 2018-08-30 14:02:08.0000000 | 2018-09-05 12:31:30.5300000
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417180.html
標籤:
