在SQL数据库中,我做了一些选择,以秒为单位获得持续时间(作为两个日期之间的减法的结果)。但是我希望将这个结果格式化为人类可读的形式,如'hh:mm'或'dd:hh'。这在SQL中是否可行,我怎么能意识到这一点?
答案 0 :(得分:5)
在SQL 2005中,您可以使用以下内容:
select convert(varchar(8), dateadd(second, [SecondsColumn], 0), 108)
首先将秒转换为1900-01-01之后的日期,然后获取hh:mm:ss部分。
如果列超过24小时,则会翻转,如果你想要几天,那么在这种情况下需要几个小时:
case when SecondsColumn> (24*60*60)
then
cast(datepart(day,datediff(dd, 0, dateadd(second, SecondsColumn, 0))) as varchar(4))
+ 'd' + convert(varchar(2), dateadd(second, SecondsColumn, 0), 108)
else
convert(varchar(8), dateadd(second, SecondsColumn, 0), 108)
end
答案 1 :(得分:2)
每个数据库的表现都不同。我使用PostgreSQL,就像这样:
select to_char(my_date - my_other_date, 'HH:MM:SS');
您必须查阅您正在使用的数据库的手册。
答案 2 :(得分:2)
假设你有几秒钟:
DECLARE @DurationSeconds INT
-- 25h 45m 14s
SET @DurationSeconds = (25 * 3600) + (45 * 60) + (14)
SELECT
@DurationSeconds,
@DurationSeconds / 3600 hours,
@DurationSeconds % 3600 / 60 minutes,
@DurationSeconds % (3600 / 60) seconds
我会让你很好地格式化这个任务。 : - )
答案 3 :(得分:0)
虽然许多DBMS都有自己的自定义语法,但没有标准。
一般来说,最好是在应用程序的表示层而不是数据库附近的任何地方进行格式化为人类可读性工作。
答案 4 :(得分:0)
在Oracle SQL中:
-- 86,400 seconds in a day
-- 3,600 seconds in an hour
-- 60 seconds in a minute
select duration, -- seconds
trunc((duration)/86400) || ':' || -- dd
trunc(mod(duration,86400)/3600) || ':' || -- hh
trunc(mod(mod(duration,86400),3600)/60) || ':' || -- mm
mod(mod(mod(duration,86400),3600),60) -- ss
as human_readable
from dual
;