T-SQL CASE WHEN BETWEEN 无法识别条件
T-SQL CASE WHEN BETWEEN not recognising condition
我有一个查询试图确定 table 中的日期对于某个 ID 当前是否介于现在和未来的某一天之间。
SELECT
COUNT(CASE
WHEN MyDate >= GETDATE() AND MyDate < DATEADD(DAY, 1, GETDATE())
THEN 1
ELSE 0
END) AS DatesNearlyOverdue
FROM MyTable
WHERE MyId = 1;
我的问题是 WHEN
条件似乎被忽略了,例如 return 与 WHEN TaskDateDue < GETDATE() THEN 1
相同的结果。我也尝试过使用 DATEDIFF
和 BETWEEN
的条件,但结果总是一样的。
是什么导致所有这些条件return相同的结果?
您正在使用 COUNT
,这与计算 0
和 1
一样愉快。如果您希望 COUNT
忽略您的 ELSE
值,请使用 NULL
而不是 0
:
SELECT
COUNT(
CASE
WHEN MyDate >= GETDATE() AND MyDate < DATEADD(DAY, 1, GETDATE()) THEN 1
ELSE NULL -- <== Change is here
END) AS DatesNearlyOverdue
FROM MyTable
WHERE MyId = 1;
话虽如此,该查询的更直接版本是:
SELECT COUNT(1) AS DatesNearlyOverdue
FROM MyTable
WHERE MyId = 1
AND MyDate >= GETDATE()
AND MyDate < DATEADD(DAY, 1, GETDATE());
如果你真的想使用THEN 1 ELSE 0
分支,因为它使你的代码更容易阅读,你实际上是在寻找SUM()
:
SELECT
SUM (
CASE
WHEN MyDate >= GETDATE() AND MyDate < DATEADD(DAY, 1, GETDATE())
THEN 1
ELSE 0
END) AS DatesNearlyOverdue
FROM MyTable
WHERE MyId = 1;
我有一个查询试图确定 table 中的日期对于某个 ID 当前是否介于现在和未来的某一天之间。
SELECT
COUNT(CASE
WHEN MyDate >= GETDATE() AND MyDate < DATEADD(DAY, 1, GETDATE())
THEN 1
ELSE 0
END) AS DatesNearlyOverdue
FROM MyTable
WHERE MyId = 1;
我的问题是 WHEN
条件似乎被忽略了,例如 return 与 WHEN TaskDateDue < GETDATE() THEN 1
相同的结果。我也尝试过使用 DATEDIFF
和 BETWEEN
的条件,但结果总是一样的。
是什么导致所有这些条件return相同的结果?
您正在使用 COUNT
,这与计算 0
和 1
一样愉快。如果您希望 COUNT
忽略您的 ELSE
值,请使用 NULL
而不是 0
:
SELECT
COUNT(
CASE
WHEN MyDate >= GETDATE() AND MyDate < DATEADD(DAY, 1, GETDATE()) THEN 1
ELSE NULL -- <== Change is here
END) AS DatesNearlyOverdue
FROM MyTable
WHERE MyId = 1;
话虽如此,该查询的更直接版本是:
SELECT COUNT(1) AS DatesNearlyOverdue
FROM MyTable
WHERE MyId = 1
AND MyDate >= GETDATE()
AND MyDate < DATEADD(DAY, 1, GETDATE());
如果你真的想使用THEN 1 ELSE 0
分支,因为它使你的代码更容易阅读,你实际上是在寻找SUM()
:
SELECT
SUM (
CASE
WHEN MyDate >= GETDATE() AND MyDate < DATEADD(DAY, 1, GETDATE())
THEN 1
ELSE 0
END) AS DatesNearlyOverdue
FROM MyTable
WHERE MyId = 1;