【问题标题】:Changing int to Time from a DateDiff从 DateDiff 将 int 更改为 Time
【发布时间】:2013-11-27 14:08:57
【问题描述】:

我有 3 次要放在条形图上,但我不知道如何将 AvgUserSegmentTime 更改为时间格式 (00:00:00.00)。现在我得到 Fastest = 00:00:00.01 Slowest = 00:00:24:22.22 和 Avg = 61,这意味着条形图上的平均值要大得多。关于如何将 int 更改为时间的任何想法?

SELECT  FastestSegmentTime , SlowestSegmentTime,  
 (SELECT AVG(DateDiff(SECOND, tblTrace.trStart , tblTrace.trFinish)) 
    FROM tblTrace
   INNER JOIN 
         tblUsers 
      ON usrID = tr_usrID
   WHERE tblTrace.trFinish IS NOT NULL 
     AND tblTrace.trObjectType LIKE 'Segment%' 
     AND tblTrace.tr_vnuID = @vnuID 
     AND tblTrace.trStart BETWEEN @StartDate AND @EndDate 
     AND tblUsers.usrEmail NOT LIKE '%@test%' ) as AvgSegmentTime
    FROM ( 
      SELECT MIN(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME(2))) AS FastestSegmentTime,  
             MAX(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME(2))) AS SlowestSegmentTime            
        FROM tblTrace 
       INNER JOIN 
             tblUsers 
          ON usrID = tr_usrID
       WHERE tr_vnuID = @vnuID 
         AND trFinish IS NOT NULL 
         AND tr_usrID IS NOT NULL 
         AND trObjectType LIKE 'Segment%'  
         AND trStart BETWEEN @StartDate AND @EndDate 
         AND tblUsers.usrEmail NOT LIKE '%@test%'
) coreData

【问题讨论】:

    标签: sql sql-server time int datediff


    【解决方案1】:

    就我个人而言,我会首先使用分组来提高效率(这部分当然是可选的),但是您的问题正在发生,因为它是平均秒数,但将其他秒数报告为时间。使用以下answer,您可以在秒和时间之间进行转换,以便进行相应的比较,或者您可以将以前的列转换为秒。

    SELECT  
        FastestSegmentTime = MIN(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME(2)))
        , SlowestSegmentTime = MAX(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME(2)))
        , AvgSegmentTime = DATEADD(ms, 1000 * AVG(DATEDIFF(SECOND, tblTrace.trStart , tblTrace.trFinish)),0)
    FROM 
        tblTrace
        INNER JOIN tblUsers ON usrID = tr_usrID
    WHERE 
        (tblTrace.trFinish IS NOT NULL)
        AND (tblTrace.trObjectType LIKE 'Segment%') 
        AND (tblTrace.tr_vnuID = @vnuID) 
        AND (tblTrace.trStart BETWEEN @StartDate AND @EndDate)
        AND (tblUsers.usrEmail NOT LIKE '%@test%')
    

    【讨论】:

      【解决方案2】:

      尝试像这样将平均 datediff 添加到 0:

      SELECT  FastestSegmentTime , SlowestSegmentTime,  
       (SELECT dateadd(second, AVG(DateDiff(SECOND, tblTrace.trStart , tblTrace.trFinish)),0) as AVGSegmentTime
          FROM tblTrace
         INNER JOIN 
               tblUsers 
            ON usrID = tr_usrID
         WHERE tblTrace.trFinish IS NOT NULL 
           AND tblTrace.trObjectType LIKE 'Segment%' 
           AND tblTrace.tr_vnuID = @vnuID 
           AND tblTrace.trStart BETWEEN @StartDate AND @EndDate 
           AND tblUsers.usrEmail NOT LIKE '%@test%' ) as AvgSegmentTime
          FROM ( 
            SELECT MIN(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME(2))) AS FastestSegmentTime,  
                   MAX(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME(2))) AS SlowestSegmentTime            
              FROM tblTrace 
             INNER JOIN 
                   tblUsers 
                ON usrID = tr_usrID
             WHERE tr_vnuID = @vnuID 
               AND trFinish IS NOT NULL 
               AND tr_usrID IS NOT NULL 
               AND trObjectType LIKE 'Segment%'  
               AND trStart BETWEEN @StartDate AND @EndDate 
               AND tblUsers.usrEmail NOT LIKE '%@test%'
      ) coreData
      

      【讨论】:

      • 您可以使用Cast('00:00:00.00' as Time) 而不是0 作为DateAdd 的第三个参数
      猜你喜欢
      • 1970-01-01
      • 2013-11-17
      • 2018-12-31
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 2015-07-31
      • 2013-09-24
      • 1970-01-01
      相关资源
      最近更新 更多