asp.net - 查找同一列的行之间的差异(时间数据之间的差异)

标签 asp.net sql sql-server datetime time

我想找到同一员工组的同一列中的时间数据之间的差异。我写了一个查询如下:

WITH    rows AS
        (
        SELECT  isnull(left(hhmm,2)+ ':'+ right(left(hhmm,4),2),'''') as login,
         ROW_NUMBER() OVER (ORDER BY cardno) AS rn
        FROM    ATTN01072013_copy13_7_13 
        )
SELECT  *--mc.login-mp.login as diff
FROM    rows mc
JOIN    rows mp
ON      mc.rn = mp.rn - 1 

此查询将返回如下数据:

cardno  login   rn  cardno  login   rn
E44920  09:18   1   E44920  09:46   2
E44920  09:46   2   E44920  17:09   3
E44920  17:09   3   E44920  16:57   4
E44920  16:57   4   E44920  17:34   5
E44920  17:34   5   E44920  17:53   6
E44920  17:53   6   E44920  17:56   7
E44920  17:56   7   E44920  17:57   8
E44920  17:57   8   E44920  18:00   9

现在我想找到第一次和第二次登录时间之间的差异..然后是第三次和第四次登录时间。我该如何做到这一点,请尽快提出解决方案,谢谢。

最佳答案

解决方案:

DECLARE @Event TABLE(
    EventID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    CardNo VARCHAR(10) NOT NULL,
    [Login] DATETIME NOT NULL
    -- To prevent duplicate events
    -- This constraint will create an index used to optimize the RowNum and the last queries
    UNIQUE(CardNo,[Login]) 
);

INSERT INTO @Event(CardNo,[Login])
            SELECT 'E44920', '2013-07-15T09:18:00'
UNION ALL   SELECT 'E44920', '2013-07-15T09:46:00'
UNION ALL   SELECT 'E44920', '2013-07-15T17:09:00'
UNION ALL   SELECT 'E44920', '2013-07-15T16:57:00'
UNION ALL   SELECT 'E44920', '2013-07-15T17:34:00'
UNION ALL   SELECT 'E44920', '2013-07-15T17:53:00';

DECLARE @EventWithRowNum TABLE(
    RowNum INT NOT NULL,
    CardNo VARCHAR(10) NOT NULL,
    PRIMARY KEY (CardNo,RowNum),
    [Login] DATETIME NOT NULL
    UNIQUE(CardNo,[Login])
);
INSERT INTO @EventWithRowNum (CardNo,[Login],RowNum)
SELECT  e.CardNo, e.[Login], ROW_NUMBER() OVER(PARTITION BY e.CardNo ORDER BY e.[Login]) AS RowNum
FROM    @Event e;

-- Final query
SELECT  crt.RowNum,
        crt.CardNo, 
        crt.[Login] AS CurrentLogin,
        nxt.RowNum,
        nxt.[Login] AS NextLogin,
        DATEDIFF(SECOND, crt.Login, nxt.Login) AS Diff_Seconds
FROM    @EventWithRowNum crt -- crt = odd rows
LEFT JOIN @EventWithRowNum nxt ON crt.CardNo=nxt.CardNo AND crt.RowNum=nxt.RowNum-1 -- nxt = even rows
WHERE   crt.RowNum % 2 = 1 -- odd rows; you could add a computed column Modulo2 AS (RowNum % 2) PERSISTED and then you could define a index (key: Modulo2, CardNo, Login)
ORDER BY crt.CardNo, crt.[Login];

结果:

RowNum      CardNo     Current_Login           RowNum      Next_Login              Diff_Seconds
----------- ---------- ----------------------- ----------- ----------------------- ------------
1           E44920     2013-07-15 09:18:00.000 2           2013-07-15 09:46:00.000 1680
3           E44920     2013-07-15 16:57:00.000 4           2013-07-15 17:09:00.000 720
5           E44920     2013-07-15 17:34:00.000 6           2013-07-15 17:53:00.000 1140

关于asp.net - 查找同一列的行之间的差异(时间数据之间的差异),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17648323/

相关文章:

c# - 在 C# 中使用 RSA 公钥和私钥加密数据

mysql - 缓慢的存储过程 - SQL Server

asp.net - 如何从 Asp.Net 那样的堆栈跟踪中获取 "Source Error"?

asp.net - 使用本地IIS Web服务器进行调试

python - 使用wxPython显示SQL查询结果

java - Hibernate 级联继承

sql - SSIS 无法读取 excel 文件中的列结尾(Excel 连接管理器)

sql-server - SQL Server 2008r2 <--> 前端 MS Access 的最佳版本

asp.net - 响应内容类型为 CSV

mysql - SQL 语句 Max(Count(*))