Tin*_*dan 6 sql sql-server-2008
我有一个包含整数值的数据库列,该值表示以秒为单位的系统运行时间.我真的很喜欢一个查询能够以一个小时(s)小时的简单易读格式向我展示时间,但我不太清楚该怎么做.我发现的很多例子似乎都使用参数作为例子,但在select函数中如何使用它并没有多少.
我需要的时间与网站上显示的内容相同.我之前尝试了一个查询,并添加了几天并删除了分钟.谁能帮我吗?
来源数据:
PDT0014 6141
PDT0008 4990
PDT0024 840227
PDT0033 2301
PDT0035 5439
PDT0005 3434
PDT0019 5482
Run Code Online (Sandbox Code Playgroud)
示例代码:
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
Run Code Online (Sandbox Code Playgroud)
期望的查询输出:
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)
Run Code Online (Sandbox Code Playgroud)
Aar*_*and 10
根据您想要的输出:
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);
Run Code Online (Sandbox Code Playgroud)
结果:
1 Day(s), 14:51:45
Run Code Online (Sandbox Code Playgroud)
要么:
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).';
Run Code Online (Sandbox Code Playgroud)
结果:
1 Day(s), 14 Hour(s), 51 Minute(s), 45 Second(s).
Run Code Online (Sandbox Code Playgroud)
您可以60/60/24使用86400等替换,但如果您在/秒/分钟/小时计算中离开,我会发现它更好地自我记录.如果你要反对一张桌子,只需用column_name它代替@s.
我倾向于使用:
CAST(FLOOR(seconds / 86400) AS VARCHAR(10))+'d ' +
CONVERT(VARCHAR(5), DATEADD(SECOND, Seconds, '19000101'), 8)
Run Code Online (Sandbox Code Playgroud)
顶部部分只是以整数形式获取您的日期,底部使用SQL-Server的转换将日期转换为varchar,格式为HH:mm:ss,将秒转换为日期.
例如
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
Run Code Online (Sandbox Code Playgroud)
NB更改 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
Run Code Online (Sandbox Code Playgroud)
我刚刚用以下内容替换了对列的每个引用seconds:
ROUND(Seconds / 60.0, 0) * 60
Run Code Online (Sandbox Code Playgroud)
因此,在进行转换之前,将秒值舍入到最接近的分钟
您可以通过除以 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
Run Code Online (Sandbox Code Playgroud)
269272表示 3 天(259200 秒)、2 小时(7200 秒)、47 分钟(2820 秒)和 52 秒。
该查询产生:
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
Run Code Online (Sandbox Code Playgroud)
将 125(2 分 5 秒)替换为 259200 将产生:
| DAYS | HOURS | MINUTES | SECONDS |
------------------------------------
| 0 | 0 | 2 | 5 |
Run Code Online (Sandbox Code Playgroud)
要将其转换为字符串表示形式,您可以使用 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
62500 次 |
| 最近记录: |