用户自新年以来未登录

时间:2013-07-19 20:36:00

标签: sql-server-2008 jira

我正在尝试编写一个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列。

2 个答案:

答案 0 :(得分:1)

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

在这种情况下,Unix时间包括毫秒,因此您还需要乘以1000或将999加到最后,例如。

Attribute_value&lt; '1357019999999'

或者

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

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

答案 1 :(得分:0)

这个是针对Oracle的(抱歉,手头没有SQL Server),列出用户和活动时间戳,如果它在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进行反加入以获取被动用户。