SQL Server - 将日期组织到表

时间:2016-06-24 10:14:48

标签: sql sql-server

对于广泛的标题感到抱歉,因为我不确定如何说出来,但这就是我在做的事情:

我有一个名为Scanner的表格,其中包含ScannerID(主键),StaffIDEventTimeStatus。此表记录每次在设备上进行扫描并将其记录到EventTime上的此表中。 StaffID根据卡片详细信息确定其身份。最后,Status每次根据StaffID记录扫描时都会计时,例如:

  ScannerID          StaffID          EventTime          Status
      1                 1         2016-06-24 07:30:00      1
      2                 1         2016-06-24 13:00:00      2
      3                 1         2016-06-24 14:00:00      3
      4                 1         2016-06-24 17:00:00      4
      5                 2         2016-06-24 08:30:00      1
      6                 2         2016-06-24 17:30:00      2

问题 根据这些数据,我希望能够在下面的视图中一起阻止这些数据,例如:

StaffID          StartDate                 EndDate     
   1         2016-06-24 07:30:00      2016-06-24 13:00:00 
   1         2016-06-24 14:00:00      2016-06-24 17:00:00  

这是基于来自Status的奇数是StartDate,而来自Status的偶数是EndDate。

其他信息

  • 状态从每天1开始,并根据StaffID
  • 递增
  • 澄清:奇数是StartDate,甚至是EndDate。这是因为卡扫描的数量不明,但总是以偶数结束,因为他们无法离开大楼而不扫描。这就是我在设计中所处理的前提

这是可行的,如果是这样的话,我该怎样才能创建一个视图,或者我可以选择哪些选项可以使用奇异分解中显示的数据?

感谢您对此事的所有帮助和建议

4 个答案:

答案 0 :(得分:2)

一个简单的Group By StaffID,((Status + 1)/ 2)将完成这个技巧

您甚至可以添加最小/最大扫描程序

Declare @Table table (ScannerID int,StaffID int,EventTime Datetime,Status int)
Insert into @Table values 
(1,1,'2016-06-24 07:30:00',1),
(2,1,'2016-06-24 13:00:00',2),
(3,1,'2016-06-24 14:00:00',3),
(4,1,'2016-06-24 17:00:00',4)

Select StaffID
      ,StartDate = min(EventTime)
      ,EndDate   = max(EventTime)
 From  @Table
 Group By StaffID,((Status+1)/2)
 Order By 1,2


StaffID StartDate               EndDate
1       2016-06-24 07:30:00.000 2016-06-24 13:00:00.000
1       2016-06-24 14:00:00.000 2016-06-24 17:00:00.000

答案 1 :(得分:1)

您应该在表格中添加父ID。

StaffID          EventTime          Status  PKId  ParentPKId
1         2016-06-24 07:30:00       1       1     0
1         2016-06-24 13:00:00       2       2     1
1         2016-06-24 14:00:00       3       3     0
1         2016-06-24 17:00:00       4       4     3

然后

 SELECT
    A.StaffID,
    A.EventTime AS StartDate,
    B.EventTime AS EndDate     
 FROM
    TABLE A LEFT JOIN
    TABLE B ON A.PKId = B.ParentPKId
 WHERE 
    A.Status % 2 = 1

答案 2 :(得分:1)

试试这个......

CREATE TABLE #Scanning(StaffID INT, EventTime DATETIME, Status INT)

INSERT INTO #Scanning
VALUES  
    (1, '2016-06-24 07:30:00',  1)
   ,(1, '2016-06-24 13:00:00',  2)
   ,(1, '2016-06-24 14:00:00',  3)
   ,(1, '2016-06-24 17:00:00',  4)
   ,(1, '2016-06-25 07:30:00',  1)
   ,(1, '2016-06-25 13:00:00',  2)
   ,(1, '2016-06-25 14:00:00',  3)
   ,(1, '2016-06-25 17:00:00',  4)

SELECT  s1.StaffID, 
        s1.EventTime AS StartDate,
        s2.EventTime AS EndDate
FROM #Scanning s1
LEFT JOIN #Scanning s2 ON s1.StaffID = s2.StaffID
    AND s2.Status = s1.Status + 1
    AND CAST(s1.EventTime AS DATE) = CAST(s2.EventTime AS DATE) -- match for each day..
WHERE s1.Status%2 = 1       -- only rows with odd Numbers

答案 3 :(得分:1)

Select 
   *
From
  (
    Select staffid, eventtime, status from table 
     Where cast (status as float) % 2 =0
  ) as enters
  Left outher  join (
  Select staaffid ,eventtime , statsus from table
  Where cast (status as float) % 2 >0
) as exits on enters.staffid=exits.staffid and enters.status+1= exits.statsu