2017-02-20 52 views
-2

在下表中,如何获取用户在'2016-12-12 00:00:00.0'和'2017-02-20之间的状态 23:59:59.999' 。结果应该是emailVerified活跃在一个日期时间列上应用日期范围的行选择

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

表粘贴为文本,而不是XML。 –

+1

如果日期介于“2016-12-12 00:00:00.0”和“2017-02-20 23:59:59.999”之间,结果将仅返回“有效”。 'emailVerified'用于'2016-12-10'! –

+0

@ahmedab​​delqader在2016-12-12他的状态是emailVerified,我也想要。 – itsraja

回答

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 
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' 
+0

它将只返回活动 – itsraja

+0

@itsraja你的'emailVerified'数据有'2016-12-10',所以这个结果应该是好吧...不是吗? – Shnugo

+0

@Shnugo不,在这里,我只有一列来更新状态更改。在2016-12-12他被电子邮件认证,在2017-02-20他活跃起来。我想要两个。如果我有每个状态的From和To日期,那么它将起作用。但在这里,我必须考虑以前更新日期的给定fromDate的状态。 – itsraja

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

'之间'可能会引起误解。你可能想读这个:[和魔鬼有什么共同之处? - 亚伦伯特兰](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx)和这个:[Bad习惯踢:错误处理日期/范围查询 - Aaron Bertrand](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range- queries.aspx) – SqlZim

相关问题