在一个SQL数据库我使秒一些选择,即得到一个持续时间(如两个日期之间的减法的结果)作为int。但我想这个结果在人类可读的形式像格式“HH:MM”或“DD:HH”。这有可能在SQL和我如何能实现呢?

有帮助吗?

解决方案

在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

其他提示

每个数据库做它不同。我使用PostgreSQL和它它像这样:

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

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

假设你有秒:

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

我会让格式的任务很好地给你。 : - )

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

在一般,最好是做格式化,为人类可读性在您的应用程序的表示层工作,而不是数据库附近的任何地方。

在的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
   ;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top