2

在 SQL 数据库中,我进行了一些选择,以秒为单位获得持续时间(作为两个日期之间减法的结果)作为 int。但我想将此结果格式化为人类可读的形式,如“hh:mm”或“dd:hh”。这在 SQL 中是可能的吗?我怎样才能实现这一点?

4

5 回答 5

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
于 2008-10-13T09:47:52.820 回答
2

每个数据库的做法都不同。我使用 PostgreSQL,它是这样的:

select to_char(my_date - my_other_date, 'HH:MM:SS');

您必须查阅您正在使用的数据库的手册。

于 2008-10-13T09:52:26.010 回答
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

我会把格式化的任务交给你。:-)

于 2008-10-13T09:55:58.310 回答
0

尽管许多 DBMS 都有自己的自定义语法,但没有标准。

一般来说,最好在应用程序的表示层而不是数据库附近的任何地方进行格式化以供人类阅读。

于 2008-10-13T13:08:55.783 回答
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
   ;
于 2012-02-07T23:35:03.727 回答