2013-07-19 36 views
0

我想写一个SQL查询,它将返回自新年以来尚未登录的用户。这是查询。用户未登录,因为新年

SELECT 
    [jira].[dbo].[cwd_user].user_name, 
    dateadd(second,cast(cast([jira].[dbo].[cwd_user_attributes].attribute_value as nvarchar(255)) as bigint)/1000,'19700101 00:00:00:000') AS last_logged 
FROM 
    [jira].[dbo].[cwd_user], [jira].[dbo].[cwd_user_attributes] 
WHERE 
    [jira].[dbo].[cwd_user].id = [jira].[dbo].[cwd_user_attributes].user_id 
    AND [jira].[dbo].[cwd_user_attributes].attribute_name = 'login.lastLoginMillis' 
    AND [jira].[dbo].[cwd_user_attributes].attribute_value < DATEPART(MS, '2012-12-31 23:59:59') 

我收到以下错误。

nvarchar值'1374247985584'的转换溢出了一个int列。

+0

那么消息是正确的1374247985584是太大,不适合整数。最初的attribute_value列的格式是什么? DATEPART(MS,xxx)只会返回您输入的日期为0的日期的毫秒部分,您是否还认购? –

+0

@DaveWilliams,attribute_value列的格式是nvarchar(255)。 –

+0

为什么将它作为nvarchar存储?如果它的日期将其作为日期存储,如果它的刻度存储为bigint等等。您实际存储在那里的是什么? –

回答

1

好的,最后一次登录是以Unix时间存储的,因此您需要将时间31-12-2012转换为Unix时间进行比较。

在这种情况下,Unix时间包括毫秒,因此您还需要乘以1000或在结尾添加999,例如,

ATTRIBUTE_VALUE <“1357019999999”

或者

attribute_value < DATEDIFF(ms,'19700101 00:00:00:000','20121231 23:59:59:999') 

你可以把你喜欢的任何时间戳记,它应该能够在两个nvarchars正确比较。

+0

表cwd_user_attributes以密钥对格式存储信息。因此,对于关键的login.lastLoginMillis,值为1374247985584. –

+0

是的,我可以看到...但该值的值部分是一个nvarchar,表示自1970年以来经过的毫秒数,因此您需要将它与相同的值进行比较你的新年日期。看到我更新的答案。 –

0

这一个是Oracle(对不起,不掌握SQL服务器),列表中的用户和活动的时间戳,如果它或在2013年之后

WITH w_all_user_activities AS 
(SELECT author, g.created 
    FROM jiraissue i 
    INNER JOIN changegroup g ON i.id = g.issueid 
    INNER JOIN changeitem c ON c.groupid = g.id 
    UNION 
    SELECT author, created FROM jiraaction 
    UNION 
    SELECT reporter, created FROM jiraissue), 
w_tmp_latest_user_activities AS 
(SELECT author, created, RANK() OVER (PARTITION BY author ORDER BY created DESC) dest_rank 
    FROM w_all_user_activities), 
w_latest_user_activities AS 
(SELECT author, created FROM w_tmp_latest_user_activities WHERE dest_rank = 1) 
SELECT * 
FROM w_latest_user_activities 
WHERE created >= TO_DATE('2013-01-01', 'yyyy-mm-dd'); 

然后,你可以做一个反连接对cwd_user获得被动用户。

相关问题