Sql 指定登录时间和注销时间之间的脱机时间

Sql 指定登录时间和注销时间之间的脱机时间,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我一直在一个项目中工作,以创建进度遵守,我已经订购了实时和进度时间,以获得两者之间的百分比。但我发现了一个实时路障。有些员工将午餐从手机脱机,而不是设置辅助状态。以下是一个例子: CCMS ID | Exception | LoginTime | LogoutTime | LogoutDate --------+-----------+-----------+------------+----------- 2747738 | Open | 09:31:00 | 12:25:00

我一直在一个项目中工作,以创建进度遵守,我已经订购了实时和进度时间,以获得两者之间的百分比。但我发现了一个实时路障。有些员工将午餐从手机脱机,而不是设置辅助状态。以下是一个例子:

CCMS ID | Exception | LoginTime | LogoutTime | LogoutDate
--------+-----------+-----------+------------+-----------
2747738 | Open      | 09:31:00  | 12:25:00   | 2018-06-19
2747738 | AUX 1     | 12:25:00  | 12:35:00   | 2018-06-19
2747738 | Open      | 12:35:00  | 14:00:00   | 2018-06-19
2747738 | Open      | 15:00:00  | 16:35:00   | 2018-06-19
2747738 | AUX 8     | 16:35:00  | 16:38:00   | 2018-06-19
2747738 | Open      | 16:38:00  | 17:30:00   | 2018-06-19
2747738 | AUX 1     | 17:30:00  | 17:40:00   | 2018-06-19
2747738 | Open      | 17:40:00  | 18:33:00   | 2018-06-19
正如你从上面看到的,时间是未知的。请注意,对于14:00和15:00之间的时间,没有任何条目。我想做的是解释所有的时间,有点像下面这样。在这里,您可以看到在14:00到15:00之间有一个新的开放条目,这样就可以计算一天中的所有时间:

  CCMS ID | Exception | LoginTime | LogoutTime | LogoutDate
  --------+-----------+-----------+------------+-----------
  2747738 | Open      | 09:31:00  | 12:25:00   | 2018-06-19
  2747738 | AUX 1     | 12:25:00  | 12:35:00   | 2018-06-19
  2747738 | Open      | 12:35:00  | 14:00:00   | 2018-06-19
  vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
>>2747738 | Open      | 14:00:00  | 15:00:00   | 2018-06-19<< Created entry here
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  2747738 | Open      | 15:00:00  | 16:35:00   | 2018-06-19
  2747738 | AUX 8     | 16:35:00  | 16:38:00   | 2018-06-19
  2747738 | Open      | 16:38:00  | 17:30:00   | 2018-06-19
  2747738 | AUX 1     | 17:30:00  | 17:40:00   | 2018-06-19
  2747738 | Open      | 17:40:00  | 18:33:00   | 2018-06-19
我期待着用你的知识来完成这件事。
提前感谢。

如果您使用MSSQL,这里是解决方案,我将您的表命名为T4


请不要提交附有图片数据的问题。随着时间的推移,图像可能变得不可用,并严重降低您问题的价值。第一次使用StackOverflow询问一些理解的问题。不用担心。你用的是哪种数据库MSSQL、mysql…哪种?SQL只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签:postgresql、oracle、db2、sql server等等。。。
SELECT
    RES.[CCMS ID]
    , CASE WHEN U.[NR]=1 THEN '**hole**' ELSE RES.[Exception] END AS [Exception]
    , CASE WHEN U.[NR]=1 THEN  RES.[LogoutTime] ELSE RES.[LoginTime] END AS [LoginTime]
    , CASE WHEN U.[NR]=1 THEN  RES.[B LoginTime] ELSE RES.[LogoutTime] END AS [LogoutTime] 
    , RES.[LogoutDate] 
FROM
(
    SELECT 1
    UNION
    SELECT 2
) U(NR)
INNER JOIN 
    (
    SELECT
    A.[CCMS ID], A.[Exception], A.[LoginTime], A.[LogoutTime], A.[LogoutDate] 
    ,B.[CCMS ID] AS [B CCMS ID], B.[Exception] AS [B Exception], B.[LoginTime] AS [B LoginTime], B.[LogoutTime] AS [B LogoutTime], B.[LogoutDate] AS [B LogoutDate] 
    ,CASE WHEN A.[LogoutTime]<>B.[LoginTime] THEN 1 ELSE 2 END AS [hole]
    FROM
    T4 A
    LEFT JOIN T4 B ON 
        B.[CCMS ID]=A.[CCMS ID] 
        AND B.[LogoutDate]=A.[LogoutDate] 
        AND B.[LoginTime]>A.[LoginTime] 
        AND NOT EXISTS(
          SELECT * FROM T4 C WHERE 
            C.[CCMS ID]=B.[CCMS ID] 
            AND C.[LogoutDate]=B.[LogoutDate] 
            AND C.[LoginTime]<B.[LoginTime]
            AND C.[LoginTime]>A.[LoginTime]
          )
    ) RES ON 
            CASE WHEN RES.[hole]=1 THEN 1 ELSE 0 END=U.[NR]
            OR
            CASE WHEN RES.[hole] IN (1,2) THEN 2 ELSE 0 END=U.[NR]


CCMS ID Exception   LoginTime   LogoutTime  LogoutDate
2747738 Open    09:31:00.0000000    12:25:00.0000000    2018-06-19
2747738 AUX 1   12:25:00.0000000    12:35:00.0000000    2018-06-19
2747738 **hole**    14:00:00.0000000    15:00:00.0000000    2018-06-19
2747738 Open    12:35:00.0000000    14:00:00.0000000    2018-06-19
2747738 Open    15:00:00.0000000    16:35:00.0000000    2018-06-19
2747738 AUX 8   16:35:00.0000000    16:38:00.0000000    2018-06-19
2747738 Open    16:38:00.0000000    17:30:00.0000000    2018-06-19
2747738 AUX 1   17:30:00.0000000    17:40:00.0000000    2018-06-19
2747738 Open    17:40:00.0000000    18:33:00.0000000    2018-06-19