【问题标题】:sql query to find the get the sum of difference in datetime stamps in hourssql查询以获取以小时为单位的日期时间戳差异总和
【发布时间】:2014-11-27 23:17:24
【问题描述】:

我正在尝试在给定表上实现单一视图:

Table:LeaseLog
------------------------------------------------------------------------------------
action           license           timeStamp
------------------------------------------------------------------------------------
Lease            ----YYB--------            2014-07-18 14:30:36.000 <br/>
Release          --YYB--------          2014-07-18 15:17:11.000 <br/>
Lease            ----AAR--------            2014-07-18 14:40:23.000 <br/>
Release          ---AAR -------     2014-07-18 15:38:41.000 <br/>
Lease            ---AAR----------           2014-07-18 15:41:16.000 <br/>
Lease            ---YYB----------           2014-07-19 07:53:06.000 <br/>
Release          ----YYB------          2014-07-19 08:07:51.000 <br/>
Lease            ----YYB---------           2014-07-19 08:12:43.000 <br/>
Release          ----AAR------          2014-07-19 08:19:59.000 <br/>

目标是在租用和发布时间戳之间的几小时或几分钟内找到每个已使用许可证的许可证利用率。
i 对于每个许可证密钥:遍历租约并发布:ConvertIntoHours(LeaseTimeStamp - ReleaseTimeStamp)
ii) Sum(i) 按许可证分组

输出应该是这样的:

license                   TotalUtilzation(Hours)
----------------------------------------------
YYB     ---------                  160.20 <br/>
AAR   ----------                   380    <br/>

我设法编写了脚本,该脚本将使用以下脚本给出给定日期时间的租赁和释放总小时数

SELECT x.license, 
SUM(CASE WHEN action='lease' THEN ((DATEPART(hh,timeStamp)*60)+DATEPART(mi,timeStamp)+(DATEPART(ss,timeStamp)/(60.0))) ELSE 0 END)/60.0  as Lease,
SUM(CASE WHEN action='release'THEN ((DATEPART(hh,timeStamp)*60)+DATEPART(mi,timeStamp)+(DATEPART(ss,timeStamp)/(60.0))) ELSE 0 END)/60.0 as Release
FROM [RxDatabase].[dbo].[LeaseLog]AS x
GROUP BY license

而且我知道这并没有给出正确的结果。

感谢任何帮助。

【问题讨论】:

    标签: sql-server datetime calculated-columns


    【解决方案1】:

    因为您需要在 2 个不同的 ROWS 之间进行计算,所以您需要使用 OVER 关键字

    可以在这里找到一篇很棒的帖子:http://blog.sqlauthority.com/2013/09/22/sql-server-how-to-access-the-previous-row-and-next-row-value-in-select-statement/

    简而言之:

    1. 对表格行进行排序,以便每个 Lease 记录旁边都有 Release 记录
    2. 申请结束
    3. 应用您所做的原始计算

    编辑:

    一个非常基本的演示,说明特定车辆的租赁日期和发布日期之间的差异

    SELECT *, DATEDIFF(hour, leaseTime, releaseTime) AS diff
    FROM
    (
        SELECT x.license, x.action, x.timeStamp as leaseTime
        LEAD (x.timeStamp) OVER (ORDER BY x.timeStamp) releaseTime 
        FROM [RxDatabase].[dbo].[LeaseLog] AS x
        WHERE x.license = '----YYB--------'
    )
    

    【讨论】:

    • 谢谢您的回复。。我还在想为什么我们需要使用OVER来查找时间戳的上一个和下一个,而后续记录本身将处于租用状态,如果我们查询则释放每个许可证密钥..问题仍然是我们如何设法找到那些 2-1、4-3、6-5....记录的差异
    • 对于 LEAD (x.timeStamp) OVER (ORDER BY x.action) releaseTime 也不是按动作排序时的发布时间。
    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多