2012-10-17 61 views
1

我有注册聘用过的员工在工作出勤时间时钟应用程序,SQL简单的查询使用日期

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

因此,如果有在去年创纪录的无timeout具有当前UserId那么Enter按钮将被隐藏

这个TimeIn是表:(tId是PK IDENTITY)

enter image description here

所以根据这些记录,例如,在过去(前1)不退出,因此用户将不会看到的Enter button,即允许用户登录,事业没有最后的TimeOut

行动从asp.netC#代码后面的工作我试图使用工作作为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

它可能是你需要其中userid = 3571 ORDER BY TID desc'(或TimeIn)从tblTime'选择顶部1超时,然后检查返回值是'DbNull.Value'? – nrodic

+0

@nrodic与我缺乏体验每一个简单的解决方案可能会结束,因为代码(查询以上)太复杂了,我可能想要一个简单的'bool'来检查这个查询返回通过'try { Conn.Open() ; strValue = TblStrCMD.ExecuteScalar()。ToString(); } finally { Conn.Close(); } } return strValue ==“”;' – LoneXcoder

回答

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 
       ) 

但是ID并不是获取最新记录的好选择。也许你想沿着这些路线的更多的东西,但它取决于列的含义,如果有可能是重复的...:

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

+0

你的答案很好,看起来很有前途* top 1,goona从Code Behind开始,然后在服务器上给它一个继续的功能(现在先在VS上测试它然后加载到服务器(主要是它没有像预期的那样工作......不知道你是谁.. – LoneXcoder

+0

作品就像我想的那样,用各种方法测试它,像魅力一样工作!非常感谢! – LoneXcoder

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,当中您可能要跟踪其他的事情。

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;