SQL Server - 找出给定日期范围内的活跃客户

时间:2016-04-07 06:09:47

标签: sql-server-2008

我有一个客户表

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

现在,我想编写一个查询,以查找在以下条件下当前日期有效的客户。

  1. 如果开始日期和结束日期均不为空,则客户在指定的日期范围内处于活动状态。

  2. 如果开始日期为NULL且结束日期在那里,则客户处于活动状态,直至结束。

  3. 如果有开始日期且结束日期为NULL,则客户从startdate处于活动状态。

  4. 如果开始日期和结束日期为NULL,则客户始终处于活动状态。

  5. 示例输出:

    当前日期:2016-04-07

    CustomerCode    
    ----------------
    C1               
    C3               
    C5               
    

    请回复。感谢。

2 个答案:

答案 0 :(得分:0)

实现逻辑的一种方法是使用COALESCE()StartDate上的EndDate函数。如果StartDateNULL,您可以将其替换为非常早的日期(以下示例中的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')