1

我有一个时钟应用程序,可以记录员工的出勤情况,

我试图根据查询将“Enter” 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),'')
4

3 回答 3

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 子句的一部分。

于 2012-10-18T00:20:58.050 回答
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 InSign Out您可能想要跟踪 和 。

于 2012-10-18T00:23:49.650 回答
1

格伦,你打败了我!以下将获取最近 TimeIn 的记录(假设没有重复项),并将为您提供一个 Y/N 标志来确定是否显示 Enter 按钮。

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;
于 2012-10-18T00:24:59.700 回答