选择在一个日期时间列上应用的日期范围的行

时间:2017-02-20 12:50:23

标签: sql sql-server

在下表中,如何获取用户在“2016-12-12 00:00:00.0”和“2017-02-20 23:59:59.999”之间的状态 。结果应为 email验证有效

userid  status          actionDateTime
113     emailPending    2016-11-24 11:59:26.427
113     emailVerified   2016-12-10 17:21:15.240
113     Active          2017-02-07 13:24:01.330

3 个答案:

答案 0 :(得分:1)

您正在寻找最小的日期和最小的日期。

试试这样:

DECLARE @tbl TABLE(userid INT,[status] NVARCHAR(100),actionDateTime DATETIME);
INSERT INTO @tbl VALUES
 (113,'emailPending',{ts'2016-11-24 11:59:26.427'})
,(113,'emailVerified',{ts'2016-12-10 17:21:15.240'})
,(113,'Active',{ts'2017-02-07 13:24:01.330'});

DECLARE @From DATETIME={ts'2016-12-12 00:00:00'};
DECLARE @To   DATETIME={ts'2017-02-20 23:59:59'};

SELECT * FROM @tbl AS t
WHERE t.actionDateTime >= ISNULL((SELECT MAX(x.actionDateTime) FROM @tbl AS x WHERE x.actionDateTime<@From),{d'2000-01-01'})
  AND t.actionDateTime <= ISNULL((SELECT MIN(x.actionDateTime) FROM @tbl AS x WHERE x.actionDateTime>@To),{d'9999-01-01'});

结果

userid  status           actionDateTime
113     emailVerified   2016-12-10 17:21:15.240
113     Active          2017-02-07 13:24:01.330

答案 1 :(得分:0)

您可以使用BETWEEN:

SELECT DISTINCT status FROM table WHERE actionDateTime BETWEEN '2016-12-12 00:00:00.0' AND '2017-02-20 23:59:59.999'

或者由用户:

SELECT DISTINCT userid, status FROM (
SELECT userid, status
FROM table 
WHERE actionDateTime BETWEEN '2016-12-12 00:00:00.0' AND '2017-02-20 23:59:59.999'
)

根据您的评论,这可能就是您所需要的:

WITH CTE AS (
SELECT 
    userid
    ,status
    ,actionDateTime as DateFrom
    ,ISNULL(LEAD(actionDateTime, 1) OVER (PARTITION BY userid ORDER BY actionDateTime), '9999-12-31') as DateTo
FROM table
)
SELECT DISTINCT userid, status
FROM CTE
WHERE DateTo BETWEEN '2016-12-12 00:00:00.0' AND '2017-02-20 23:59:59.999'

答案 2 :(得分:0)

SELECT DISTINCT status
FROM table
WHERE actionDateTime BETWEEN '2016-12-12 00:00:00.0' AND '2017-02-20 23:59:59.999'