2017-02-20 56 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

相關問題