【问题标题】:sql simple Query with dates带有日期的sql简单查询
【发布时间】:2012-10-17 23:45:09
【问题描述】:

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

我试图设置“Enter”imageButton 的可见性 (入口例如“Timein”字段)根据查询隐藏

因此,如果最后一条记录中没有timeout,而当前UserIdTimeIn 则将隐藏Enter 按钮

这是表格:(tId 是 PK IDENTITY)

因此基于这些记录,例如,最后一个(前 1 个)未注销,因此用户将看不到允许用户登录的 Enter button,因为没有最后一个操作 @987654329 @

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),'')

【问题讨论】:

  • 可能是你需要select top 1 TimeOut from tblTime where UserId=3571 order by tId desc(或通过TimeIn)然后检查返回值是否为DbNull.Value
  • @nrodic 由于我缺乏经验,每个简单的解决方案都可能最终因为代码(上面的查询)太复杂我可能想要一个简单的bool 来检查通过`try {返回的这个查询Conn.Open(); strValue = TblStrCMD.ExecuteScalar().ToString(); } 最后 { Conn.Close(); } 返回 strValue == "";`

标签: c# asp.net sql-server-2008 c#-4.0 asp.net-4.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
               )

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

【讨论】:

  • 您的答案很棒,看起来很有希望 *top 1 ,goona 从 Code Behind 然后在服务器上给它一个继续功能(现在首先在 VS 上测试它然后将它加载到服务器(主要是它没有'没有按预期工作......不要知道你......
  • 像我想象的那样工作,用每个选项测试它,像魅力一样工作!非常感谢!
【解决方案2】:

如果您想要明确地对此进行查询(假设 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 的表,除此之外您可能想要跟踪。

【讨论】:

    【解决方案3】:

    格伦,你打败了我!下面将获取最近 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-17
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多