关于日期和时间的SQL问题

时间:2011-07-25 15:03:39

标签: sql select sqlite

我想为SQLite3数据库创建一个SQL查询。

在我的表格中,我有以下示例数据

7/1/2011   8:00   LOGIN
7/1/2011   10:12  LOGOFF
7/1/2011   10:20  LOGIN
7/1/2011   17:15  LOGOFF
7/2/2011   9:00   LOGIN
7/3/2011   10:00  LOGIN
7/3/2011   20:00  LOGOFF

基本上我想只获得每个日期的第一个LOGIN条目和同一日期的最后一个LOGOFF条目(如果有的话)

所以我希望查询生成

7/1/2011   8:00   LOGIN
7/1/2011   17:15  LOGOFF
7/2/2011   9:00   LOGIN
7/3/2011   10:00  LOGIN
7/3/2011   20:00  LOGOFF

是否也可以使用所需的输出表计算时间差?

IE / 2011年7月1日将是9:15

2 个答案:

答案 0 :(得分:3)

假设您的列名为Date, Time, Action,这就是您所需要的:

select Date,
       case Action 
         when 'LOGIN' then Min(Time)
         when 'LOGOFF' then Max(Time)
       end as ActionTime,
       Action 
from YourTable
group by Date, Action

<强>更新

为计算差异,您可能希望将一天的行“展平”为一行:

select Date, MinLoginTime, MaxLogoffTime, MaxLogoffTime - MinLoginTime as Diff
from
(
select Date,
       Min(
           case Action 
               when 'LOGIN' then Time
               else null
           end
       ) as MinLoginTime,
       Max(
           case Action 
               when 'LOGOFF' then Time
               else null
           end
       ) as MaxLogoffTime
from YourTable
group by Date
) YourDT

一些注意事项:

  • 如果您没有MinLoginTime或MaxLogoffTime,Diff将为空
  • 您可能需要处理格式Diff。对SQLite进行一些研究,每个RDBMS都有其特殊性。

答案 1 :(得分:2)

为什么不每天都把它们放在同一条线上?

SELECT 
  LogIns.Date, LogInHour, LogOffHour
FROM
  (SELECT Date, MIN(hour) LogInHour
   FROM MyTable
   WHERE action = 'LOGIN'
   GROUP BY Date) LogIns
 LEFT JOIN
  (SELECT Date, MAX(hour) LogOffHour
   FROM MyTable
   WHERE action = 'LOGOFF'
   GROUP BY Date) LogOffs
 ON LogIns.Date = LogOffs.Date

我使用了LEFT JOIN,因为你可能在一天内有一个LOGIN但没有LOGOFF。