【发布时间】:2022-01-20 09:06:16
【问题描述】:
我有以下数据:
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
那么结果是:
我的问题是如何从WHERE 语句中排除ISNULL?
我尝试了不同的方法,但结果不正确:
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。
【问题讨论】:
-
NULL 是未知的,由程序员告诉 SQL 如何处理空值。那么,当日期为空时会发生什么?他们应该匹配还是不匹配?
-
@SalmanA NULL 不应匹配。我的意思是可以消除 ISNULL,但结果应该和我的问题一样?
标签: sql tsql datetime sql-server-2008