SQL服务器,将秒数转换为分钟,小时,天

时间:2013-10-10 14:21:33

标签: sql sql-server-2008

我有一个包含整数值的数据库列,该值表示以秒为单位的系统运行时间。我真的很喜欢一个查询能够以一个小时(s)小时的简单易读格式向我展示时间,但我不太清楚该怎么做。我发现的很多例子似乎都使用参数作为例子,但在select函数中如何使用它并没有多少。

我需要的时间与网站上显示的内容相同。我之前尝试了一个查询,并添加了几天并删除了分钟。任何人都可以帮助我吗?

来源数据:

PDT0014 6141
PDT0008 4990
PDT0024 840227
PDT0033 2301
PDT0035 5439
PDT0005 3434
PDT0019 5482

示例代码:

SELECT tblAssets.AssetName, 
(case when tblAssets.Uptime> (24*60*60) 
        then 
            cast(datepart(day,datediff(dd, 0, dateadd(second, tblAssets.Uptime, 0))) as varchar(4))
        +   ' Day(s) ' + convert(varchar(2), dateadd(second, tblAssets.Uptime, 0), 108) +' Hour(s)' 
    else
            convert(varchar(5), dateadd(second, tblAssets.Uptime, 0), 108) + ' Hour(s) Minute(s) ' 
    end) AS Uptime
FROM tblAssets

所需的查询输出:

PDT0014 01:42 Hour(s) Minute(s) 
PDT0008 01:23 Hour(s) Minute(s) 
PDT0024 10 Day(s) 17 Hour(s)
PDT0033 00:38 Hour(s) Minute(s) 
PDT0035 01:30 Hour(s) Minute(s) 
PDT0005 00:57 Hour(s) Minute(s) 
PDT0019 01:31 Hour(s) Minute(s)

5 个答案:

答案 0 :(得分:9)

取决于您想要的输出:

DECLARE @s INT = 139905;

SELECT                CONVERT(VARCHAR(12), @s /60/60/24) + ' Day(s), ' 
  +                   CONVERT(VARCHAR(12), @s /60/60 % 24) 
  + ':' + RIGHT('0' + CONVERT(VARCHAR(2),  @s /60 % 60), 2) 
  + ':' + RIGHT('0' + CONVERT(VARCHAR(2),  @s % 60), 2);

结果:

1 Day(s), 14:51:45

或者:

DECLARE @s INT = 139905;

SELECT 
    CONVERT(VARCHAR(12), @s /60/60/24)   + ' Day(s), ' 
  + CONVERT(VARCHAR(12), @s /60/60 % 24) + ' Hour(s), '
  + CONVERT(VARCHAR(2),  @s /60 % 60)    + ' Minute(s), ' 
  + CONVERT(VARCHAR(2),  @s % 60)        + ' Second(s).';

结果:

1 Day(s), 14 Hour(s), 51 Minute(s), 45 Second(s).

您可以将60/60/24替换为86400等,但如果您在/秒/分钟/小时计算中离开,我会发现它更适合自我记录。如果您要反对某个表格,只需使用column_name代替@s

答案 1 :(得分:8)

我倾向于使用:

CAST(FLOOR(seconds / 86400) AS VARCHAR(10))+'d ' +
    CONVERT(VARCHAR(5), DATEADD(SECOND, Seconds, '19000101'), 8)

顶部部分只是以整数形式获取您的日期,底部使用SQL-Server的转换将日期转换为varchar,格式为HH:mm:ss,将秒转换为日期。

e.g。

SELECT  Formatted = CAST(FLOOR(seconds / 86400) AS VARCHAR(10))+'d ' +
                        CONVERT(VARCHAR(5), DATEADD(SECOND, Seconds, '19000101'), 8),
        Seconds
FROM    (   SELECT  TOP 10 
                    Seconds = (ROW_NUMBER() OVER (ORDER BY Object_ID) * 40000)
            FROM    sys.all_Objects
            ORDER BY Object_ID
        ) S

<强> Example on SQL Fiddle

N.B。将 CONVERT(VARCHAR(5), DATEADD(.. 更改为 CONVERT(VARCHAR(8), DATEADD(.. 以在结果中保留秒数

修改

如果你不想要秒并且需要四舍五入到最接近的分钟而不是截断你可以使用:

SELECT  Formatted = CAST(FLOOR(ROUND(Seconds / 60.0, 0) * 60 / 86400) AS VARCHAR(10))+'d ' +
                        CONVERT(VARCHAR(5), DATEADD(SECOND, ROUND(Seconds / 60.0, 0) * 60, '19000101'), 8),
        Seconds
FROM    (   SELECT  Seconds = 3899
        ) S

我刚刚将seconds列的每个引用替换为:

ROUND(Seconds / 60.0, 0) * 60

因此,在进行转换之前,将秒值舍入到最接近的分钟

答案 2 :(得分:4)

您可以将秒数转换为天数除以86400

您可以通过除以3600将秒数转换为小时数,但您需要获得余数 (通过减去转换为小时的总天数)

您可以通过除以60将秒数转换为分钟,但您需要获得余数(通过减去转换为分钟的总小时数)

你可以报告秒数,但是你想要只报告剩余的秒数(通过将转换为秒的总分钟数除去)

SELECT      FLOOR( UpTime / 86400 ) AS DAYS
        ,   FLOOR( ( UpTime / 3600 ) - FLOOR( UpTime / 86400 ) * 24 ) AS HOURS
        ,   FLOOR( ( UpTime / 60 ) - FLOOR( UpTime / 3600 ) * 60 ) AS MINUTES
        ,   UpTime - FLOOR( UpTime / 60 ) * 60 AS SECONDS
FROM        ( SELECT 269272 AS UpTime ) AS X

269272代表3天(259200秒),2小时(7200秒),47分钟(2820秒)和52秒。

此查询产生:

| DAYS | HOURS | MINUTES | SECONDS |
------------------------------------
|    3 |     2 |      47 |      52 |

将125(2分钟,5秒)代替259200将产生:

| DAYS | HOURS | MINUTES | SECONDS |
------------------------------------
|    0 |     0 |       2 |       5 |

要将其转换为字符串表示形式,可以使用SQL Server 2012的FORMAT函数:

SELECT  CASE
            WHEN DAYS > 0 THEN
                FORMAT( DAYS, '##' ) + ' Day(s) ' + FORMAT( HOURS, '##' ) + ' Hour(s)'
            ELSE
                FORMAT( HOURS, '##' ) + ':' + FORMAT( MINUTES, '##' ) + ' Hour(s) Minute(s)'
        END AS UpTimeString
FROM (
    SELECT      FLOOR( UpTime / 86400 ) AS DAYS
            ,   FLOOR( ( UpTime / 3600 ) - FLOOR( UpTime / 86400 ) * 24 ) AS HOURS
            ,   FLOOR( ( UpTime / 60 ) - FLOOR( UpTime / 3600 ) * 60 ) AS MINUTES
            ,   UpTime - FLOOR( UpTime / 60 ) * 60 AS SECONDS
    FROM        ( SELECT 125 AS UpTime ) AS X
) AS UptimeSubselect

答案 3 :(得分:2)

这是另一种使用DATEPART()的方法:

DECLARE @S INT = 86472,
        @START DATETIME = CONVERT(DATETIME,0)
DECLARE @END DATETIME = DATEADD(SECOND,@S, @START)

SELECT CONVERT(VARCHAR(10),DATEPART(DAY,@END)-1) + ' Day(s) ' +
       RIGHT(CONVERT(VARCHAR(10),100+DATEPART(HOUR, @END)),2) + ':' +
       RIGHT(CONVERT(VARCHAR(10),100+DATEPART(MINUTE, @END)),2) + ':' +
       RIGHT(CONVERT(VARCHAR(10),100+DATEPART(SECOND, @END)),2) 

如果您不需要格式化时间部分:

SELECT CONVERT(VARCHAR(10),DATEPART(DAY,@END)-1) + ' Day(s) ' +
       CONVERT(VARCHAR(10),DATEPART(HOUR, @END)) + '  Hour(s)' +
       CONVERT(VARCHAR(10),DATEPART(MINUTE, @END)) + ' Minute(s)' +
       CONVERT(VARCHAR(10),DATEPART(SECOND, @END)) + ' Second(s)'

答案 4 :(得分:0)

DECLARE @Seconds INT = 86200;
SELECT CONVERT(VARCHAR(15), 
CAST(CONVERT(VARCHAR(12), @Seconds / 60 / 60 % 24)
+':'+ CONVERT(VARCHAR(2), @Seconds / 60 % 60)
+':'+ CONVERT(VARCHAR(2), @Seconds % 60) AS TIME), 100) AS [HH:MM:SS (AM/PM)]

enter image description here