我有一个客户表
TBLCustomer :
CustomerCode StartDate EndDate
-----------------------------------------
C1 2016-02-01 2016-05-01
C2 2016-05-01 2016-12-01
C3 NULL 2016-05-01
C4 2016-07-01 NULL
C5 NULL NULL
现在,我想编写一个查询,以查找在以下条件下当前日期有效的客户。
如果开始日期和结束日期均不为空,则客户在指定的日期范围内处于活动状态。
如果开始日期为NULL且结束日期在那里,则客户处于活动状态,直至结束。
如果有开始日期且结束日期为NULL,则客户从startdate处于活动状态。
如果开始日期和结束日期为NULL,则客户始终处于活动状态。
示例输出:
当前日期:2016-04-07
CustomerCode
----------------
C1
C3
C5
请回复。感谢。
答案 0 :(得分:0)
实现逻辑的一种方法是使用COALESCE()
和StartDate
上的EndDate
函数。如果StartDate
为NULL
,您可以将其替换为非常早的日期(以下示例中的1753年)。然后,如果StartDate
丢失,客户将被有效地视为他总是在那里。我为EndDate
应用了类似的逻辑。
SELECT t.*
FROM TBLCustomer t
WHERE someDate BETWEEN COALESCE(StartDate, CAST('1753-1-1' AS DATETIME)) AND
COALESCE(EndDate, CAST('9999-12-31' AS DATETIME))
答案 1 :(得分:0)
你可以简单地为ISNULL提供一个在边界之前/之后的日期:
即
WHERE @ActiveDate BETWEEN ISNULL(StartDate, '1900-01-01') AND ISNULL(EndDate, '2100-01-01')