【问题标题】:SQL Server - TimeStamp GapsSQL Server - 时间戳间隔
【发布时间】:2017-05-29 04:16:31
【问题描述】:

我刚开始学习 SQL,并且正在阅读 Ken Henderson 的一本书,名为“The Guru's Guide To Transact SQL”。在书中它给了我这张桌子:

CREATE TABLE timeclock
(
     Employee varchar(30),
     TimeIn smalldatetime,
     TimeOut smalldatetime
)

INSERT timeclock VALUES('Pythia','07:31:34','12:04:01')
INSERT timeclock VALUES('Pythia','12:45:10','17:32:49')
INSERT timeclock VALUES('Dionysus','9:31:29','10:46:55')
INSERT timeclock VALUES('Dionysus','10:59:32','11:39:12')
INSERT timeclock VALUES('Dionysus','13:05:16','14:07:41')
INSERT timeclock VALUES('Dionysus','14:11:49','14:57:02')
INSERT timeclock VALUES('Dionysus','15:04:12','15:08:38')
INSERT timeclock VALUES('Dionysus','15:10:31','16:13:58')
INSERT timeclock VALUES('Dionysus','16:18:24','16:58:01') 

然后它给出了一段代码,用于查询员工离开办公室的时间:

SELECT 
    t1.Employee, t1.TimeOut AS StartOfLoafing,
    t2.TimeIn AS EndOfLoafing,
    DATEDIFF(mi,t1.TimeOut,t2.TimeIn) AS LengthOfLoafing
FROM 
    timeclock t1 
JOIN 
    timeclock t2 ON (t1.Employee = t2.Employee)
WHERE 
    (t1.TimeOut = (SELECT MAX(t3.TimeOut)
                   FROM timeclock t3
                   WHERE (t3.Employee=t1.Employee) AND (t3.TimeOut <= t2.TimeIn)))

我尝试阅读此查询的解释,但我仍然不明白第 5-7 行(嵌套部分真的让我很反感)。似乎它正在迭代表?谁能给初学者详细解释一下。

提前谢谢你。

【问题讨论】:

标签: sql-server time nested timestamp


【解决方案1】:

上面的查询生成员工的笛卡尔积以及他们的加入时间/超时。它使用where t1.timeout= 子查询来获取最新的(在这种情况下使用maxtimeout,它小于t2.TimeIn

查询也可以这样写:

select
      t1.Employee
    , StartOfLoafing  = t1.TimeOut
    , EndOfLoafing    = t2.TimeIn 
    , LengthOfLoafing = datediff(mi,t1.TimeOut,t2.TimeIn)
  from timeclock as t1
    cross apply (
      select top 1 i.timein
        from timeclock i
        where i.employee=t1.employee
          and i.timein >=t1.timeout
        order by i.timein asc) as t2

rextester:http://rextester.com/SES2195

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2017-08-29
    • 1970-01-01
    • 2011-05-27
    • 2014-07-05
    • 2011-06-03
    • 2011-04-23
    相关资源
    最近更新 更多