我正在尝试编写一个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 :(得分: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
进行反加入以获取被动用户。