【问题标题】:total duration per client每个客户的总持续时间
【发布时间】:2017-10-13 05:44:55
【问题描述】:

我试图以 hh:mm 为单位获取每个客户的总持续时间。 这是我的查询:

SELECT 
    CONVERT(VARCHAR(10), 
            SUM(DATEDIFF(Minute, startdate,EndDate) / 60) 
                OVER (PARTITION BY clientId ORDER BY clientId)) 
       + '.' 
       + RIGHT('00' + CONVERT(VARCHAR(2), 
            SUM(DATEDIFF(Minute, startdate, EndDate)) % 60), 2) 
                (OVER(PARTITION BY clientId ORDER BY clientId))                        
FROM tableX

【问题讨论】:

  • 有什么问题?

标签: sql sql-server tsql reporting-services


【解决方案1】:

您需要将时间的第一部分转换为字符串:

SELECT 
    CONVERT(VARCHAR(10), 
            CAST(SUM(DATEDIFF(Minute, startdate,EndDate) / 60) 
                OVER (PARTITION BY clientId ORDER BY clientId)) AS VARCHAR(2))
       + '.' 
       + RIGHT('00' + CONVERT(VARCHAR(2), 
            SUM(DATEDIFF(Minute, startdate, EndDate)) % 60), 2) 
                (OVER(PARTITION BY clientId ORDER BY clientId))                        
FROM tableX;

否则,你会得到:

Msg 245, Level 16, State 1, Line 6 转换时转换失败 varchar 值 '.'数据类型为 int。

那是因为int 有更大的date type precedence 并且引擎是 尝试将 . 转换为 int 以将值转换为 SUM (+)。第三个参数已经是字符串了,因为你使用的是RIGHT函数,所以不需要强制转换。


你可以试试这个:

SELECT CONVERT(VARCHAR(10), SUM(DATEDIFF(Minute, startdate,EndDate)) OVER (PARTITION BY clientId ORDER BY clientId) / 60 ) 
       + '.' 
       + RIGHT('00' + CONVERT(VARCHAR(2), SUM(DATEDIFF(Minute, startdate, EndDate)) OVER(PARTITION BY clientId ORDER BY clientId) % 60), 2)                                         
FROM tableX

【讨论】:

    【解决方案2】:

    你可以使用它。

    SELECT 
        clientId,
        CONVERT(varchar(5), DATEADD(MINUTE, SUM(DATEDIFF(Minute, startdate,EndDate)) OVER(PARTITION BY clientId), '00:00') ,108) 
    FROM tableX
    

    【讨论】:

    • 它适用于个人记录。我希望它按 clientId 分区,所以我会看到每个客户的总数。例如 ClientA a 有 2 个持续时间,00:30 和 00:20。我希望结果显示为 ClientA =00:50
    • 你的客户表和这张表X是不同的表吗?
    • 谢谢。我在这里怎么联系你?在您的网站上与我联系正在建设中
    【解决方案3】:

    请试试这个:

    DECLARE @ClientDuration TABLE (clientId INT NOT NULL, StartDate DATETIME, EndDate DATETIME)
    
    INSERT INTO @ClientDuration VALUES (1, '2017-10-13 09:21:53', '2017-10-13 10:22:53')
    INSERT INTO @ClientDuration VALUES (1, '2017-10-14 09:21:53', '2017-10-14 10:22:53')
    INSERT INTO @ClientDuration VALUES (1, '2017-10-15 09:21:53', '2017-10-15 10:22:53')
    
    INSERT INTO @ClientDuration VALUES (2, '2017-10-13 08:21:53', '2017-10-13 10:22:53')
    INSERT INTO @ClientDuration VALUES (2, '2017-10-14 09:21:53', '2017-10-16 10:22:53')
    INSERT INTO @ClientDuration VALUES (2, '2017-10-15 10:21:53', '2017-10-15 10:22:53')
    
    ;WITH cte AS (
        SELECT 
            clientId,
            CAST((SUM(DATEDIFF(minute, startdate, enddate)) % 60) AS VARCHAR(3)) AS mins, 
            CAST((SUM(DATEDIFF(minute, startdate, enddate)) - (SUM(DATEDIFF(minute, startdate, enddate)) % 60))/60 AS VARCHAR(3)) AS hrs
        FROM @ClientDuration
        GROUP BY clientId
    )
    
    SELECT  clientId, 
        IIF(LEN(c.hrs) = 1, '0' + c.hrs, c.hrs)  + ' H :' + IIF(LEN(c.hrs) = 1, '0' + c.hrs, c.hrs) + ' M'  AS TotalDuration  
    

    来自 cte AS c

    输出:

    clientId    TotalDuration
    1           03 H :03 M
    2           51 H :51 M
    

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2016-09-11
      • 2016-02-23
      • 1970-01-01
      • 2017-02-21
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多