在下表中,如何获取用户在“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
答案 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'