【问题标题】:Display most recent date for out status显示出状态的最近日期
【发布时间】:2017-09-13 18:19:03
【问题描述】:

我正在努力解决这个问题。我有一个查询,将在两个单独的列(最初在同一列)中显示 IN 和 Out 状态和日期时间。查询将以我需要的方式返回结果,但 OUT 日期显示不正确。每个 ID 有多个 In/Out 状态和时间。我只需要最近 24 小时内的最新进出时间。该查询将正确返回 In 时间,但许多 Out 时间显示的日期早于 In 时间。所以我需要看到的是,过去 24 小时内的 OUT 时间,如果用户还没有签出,它应该是空白的。有人可以帮我吗?请参阅下面的代码。

    SELECT t1.ID, t1.FNAME, t1.InOut_Status AS Status_In, t1.Datetime AS
Datetime_IN, t2.InOut_Status AS Status_Out, t2.Datetime As Datetime_OUT
FROM table t1
LEFT JOIN table t2
    ON t1.id = t2.id
    AND t2.InOut_Status = 'OUT' AND t1.Datetime >= DATEADD(hour, -24,GETDATE())
WHERE t1.InOut_Status = 'IN'

【问题讨论】:

  • 请阅读this,了解一些改进问题的技巧。使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。

标签: sql sql-server tsql datetime


【解决方案1】:

您可以使用派生表来做到这一点。

...
LEFT JOIN 
    (select t.id, max(t.Datetime) dt
     from table t
     group by t.id
     where t.InOut_Status = 'OUT'
     AND t.Datetime >= DATEADD(hour, -24,GETDATE())) t2 on t2.id = t1.id

【讨论】:

    【解决方案2】:

    也许只使用条件聚合

    SELECT ID,
           FNAME,
           MAX(CASE
                   WHEN InOut_Status = 'IN'
                   THEN Datetime
               END) AS Datetime_IN,
           MAX(CASE
                   WHEN InOut_Status = 'OUT'
                   THEN Datetime
               END) AS Datetime_OUT
    FROM   [Table]
    WHERE  Datetime >= DATEADD(hour, -24, GETDATE())
    GROUP BY ID,
             FNAME
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多