我有一个数据库,用于在登录系统时存储getdate()的日期时间。
我想做一个选择,显示那些在过去10分钟内一直处于活动状态的选项,因为现在有效#39;而对于所有其他人来说,比如多久以前它们是活跃的,例如3天或3小时。
我不知道如何做第二部分。
这是我为获得活跃用户所做的工作:
SELECT DISTINCT FirstName, LastName, 'Active now'
FROM dbo.Users UP
INNER JOIN Portal.dbo.UserStatistics US
ON US.UserID = UP.UserID
INNER JOIN Portal.dbo.Pages
ON pages.id = US.PageID
WHERE US.DateTimeLastUpdated >= dateadd(minute, -5, getdate())
答案 0 :(得分:0)
SELECT DISTINCT FirstName, LastName,
CASE when US.DateTimeLastUpdated >= dateadd(minute, -5, getdate()) then 'Active now' else cast(datediff(h,getdate(), US.DateTimeLastUpdated) as varchar) end
FROM dbo.Users UP
INNER JOIN Portal.dbo.UserStatistics US
ON US.UserID = UP.UserID
INNER JOIN Portal.dbo.Pages
ON pages.id = US.PageID
答案 1 :(得分:0)
您可以将case
语句与group by子句一起使用:
SELECT
FirstName,
LastName,
case when max(US.DateTimeLastUpdated) >= dateadd(minute, -5, getdate()) then
'Active now'
when max(US.DateTimeLastUpdated) >= dateadd(day, -2, getdate()) then
'Active 3 days'
...
end as [last viewed]
FROM
dbo.Users UP
INNER JOIN
Portal.dbo.UserStatistics US
ON US.UserID = UP.UserID
INNER JOIN
Portal.dbo.Pages
ON pages.id = US.PageID
GROUP BY
FirstName,
LastName
答案 2 :(得分:0)
你需要聚合以获得每个用户的最新访问权限,然后使用它,所以有点像:
SELECT up.FirstName,
up.LastName,
CASE
WHEN MAX(US.DateTimeLastUpdated) >= dateadd(minute, -5, getdate()) THEN 'Now'
ELSE CAST(MAX(DATEDIFF(H, US.DateTimeLastUpdated, GETDATE())) AS VARCHAR) + ' hours ago'
AS LastActive
FROM dbo.Users UP
INNER JOIN Portal.dbo.UserStatistics US
ON US.UserID = UP.UserID
INNER JOIN Portal.dbo.Pages
ON pages.id = US.PageID
GROUP BY up.FirstName,
up.LastName