sql简单查询日期

时间:2012-10-17 23:45:10

标签: c# asp.net sql-server-2008 c#-4.0 asp.net-4.0

我有一个时钟应用程序,用于注册员工出勤,

我试图设置“输入”imageButton的可见性 (基于查询隐藏的入口,例如“Timein”字段)

因此,如果上一条记录中没有timeout,当前TimeInUserId,则隐藏Enter按钮

这是表:(tId是PK IDENTITY)

enter image description here

所以基于这些记录,例如,最后一个(前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),'')

3 个答案:

答案 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 InSign Out的表,您可能希望跟踪其他内容。

答案 2 :(得分: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;