我有一个时钟应用程序,用于注册员工出勤,
我试图设置“输入”imageButton
的可见性
(基于查询隐藏的入口,例如“Timein”字段)
因此,如果上一条记录中没有timeout
,当前TimeIn
有UserId
,则隐藏Enter
按钮
这是表:(tId
是PK IDENTITY)
所以基于这些记录,例如,最后一个(前1个)未注销,因此用户将无法看到允许用户登录的Enter button
,因为没有最后一个操作TimeOut
从asp.net
C#
代码开始工作,我试图使用datedIff
作为查询来解决问题:
但我想我错过了一些东西
如果这是我想要展示的错误方法,请不要考虑它...我确实试过,如果有更好的方法来实现我需要的东西然后只是忽略该查询
select isnull((SELECT TOP 1 case when [TimeOut] is null then '' else convert(nvarchar,[TimeOut]) end FROM tblTime WHERE datediff(day,TimeOut,getdate())=0 and UserId =3571 ORDER BY tId DESC),'')
答案 0 :(得分:1)
这将找到userId具有最高tid的记录。
SELECT CASE WHEN [TimeOut] IS NULL THEN '' ELSE CONVERT(NVARCHAR,[TimeOut]) END
FROM tblTime
WHERE tId = ( SELECT MAX(tId)
FROM tblTime
WHERE UserId = 3571
)
但是ids不是获取最新记录的好选择。可能你想要更多这些方面的东西,但它取决于列的含义,如果可能有重复......:
SELECT CASE WHEN [TimeOut] IS NULL THEN '' ELSE CONVERT(NVARCHAR,[TimeOut]) end
FROM tblTime
WHERE UserId = 3571
AND ActiveDate = ( SELECT MAX(ActiveDate)
FROM tblTime
WHERE UserId = 3571
)
或者您可以将子查询作为FROM子句的一部分。
答案 1 :(得分:1)
如果您想明确查询此问题(假设ActiveDate的含义是用户上次在网站上活动时):
SELECT TOP 1
CASE WHEN TimeOut IS NULL THEN 0 ELSE 1 END
FROM tblTime
WHERE UserID = 3571
ORDER BY ActiveDate DESC
否则,如果您将整个对象加载到代码中,只需检查最近记录的TimeOut是否为空。
我建议使用某种UserActivity表来跟踪用户登录和退出的日期和时间。通过查看空值来跟踪用户活动并不是最可靠的。
CREATE TABLE UserActivity
(
UserActivityID int,
UserActivityTypeID tinyint,
DateActivity datetime
)
UserActivityType
是另一个包含Sign In
和Sign Out
的表,您可能希望跟踪其他内容。
答案 2 :(得分:1)
SELECT (CASE WHEN t1.[TimeOut] IS NOT NULL THEN 'Y' ELSE 'N' END) AS is_enter_button_displayed
FROM tblTime t1
WHERE t1.[TimeIn] = (SELECT MAX(t2.[TimeIn]) FROM tblTime t2 WHERE t2.UserId = t1.UserId)
AND UserId = 3571;