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 列。

4

2 回答 2

1

好的,最后一次登录存储为 Unix 时间,所以您需要将 2012 年 12 月 31 日的时间转换为 Unix 时间进行比较。

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

属性值<'1357019999999'

或者

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

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

于 2013-07-19T21:42:09.790 回答
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加入来获得被动用户。

于 2015-02-20T18:58:45.423 回答