1

如何HH:MM:SS在 SQL Server 中将秒(int)转换为格式?

例如 90 应该输出 => 00:01:30

更新

我有两个日期START_DATEENDDATE

我想要这些日期的差异

最后我想总结一下HH:MM:SS格式上的这些差异

小提琴: http ://sqlfiddle.com/#!3/39c2b/1/0

4

7 回答 7

3
      declare @sec int
      set @sec=10

      select
          convert(varchar(5),@sec/3600)
           +':'+convert(varchar(5),@sec%3600/60)
           +':'+convert(varchar(5),(@sec%60));

将数据更新
为 hh:mm:ss 使用“替换”

             declare @sec int
             set @sec=90

     select
          replace(convert(varchar(5),@sec/3600)
            +':'+str(convert(varchar(5),@sec%3600/60),2)
            +':'+str(convert(varchar(5),(@sec%60)),2),' ','0');


例如看这里的例子

于 2013-01-02T04:37:51.790 回答
2
declare @Seconds int;
set @Seconds = 90;
select replace(str(@Seconds/3600,len(ltrim(@Seconds/3600))+
abs(sign(@Seconds/359999)-1)) + ':' + str((@Seconds/60)%60,2)+
':' + str(@Seconds%60,2),' ','0')
于 2013-01-02T04:40:17.110 回答
0

您指的是TIMESPANSQL中的概念。但是,T-SQL 中没有 TIMESPAN 变量。相反,您可以使用以下概念。

我不会使用 ElapsedSecond 作为存储变量(尽管它有效)。原因是为了有效地表示 TIMESPAN,最好将其存储为 DATETIME。这样,您可以获得 DATETIME 变量的所有灵活性。例如,您可以执行YEAR( @TimeSpan), MONTH( @TimeSpan )。如果您存储了 ElapsedSecond,则将更难做到这一点。

为了说明 T-SQL 中的概念:

DECLARE @StartDate AS DATETIME
DECLARE @EndDate AS DATETIME
SET @StartDate = '1/1/2013 1:01:58'
SET @EndDate = '1/5/2013 7:02:00'

DECLARE @TimeSpan AS DATETIME
SET @TimeSpan =  @EndDate - @StartDate

PRINT   CONVERT( VARCHAR, (DATEDIFF( DAY, 0, @TimeSpan) * 24) + DATEPART(HOUR, @TimeSpan) )
        + ':' + RIGHT( '0' + CONVERT( VARCHAR, DATEPART( MINUTE, @TimeSpan ) ), 2)
        + ':' + RIGHT( '0' + CONVERT( VARCHAR, DATEPART( SECOND, @TimeSpan ) ), 2 )

请注意,在上面,您可以DATEPART()像使用任何DATETIME变量一样使用该函数并处理 TimeSpan。当您了解更多细节时,这将更加灵活和重要。

另一个优点是时间跨度。如果您使用 ElapsedSecond 方法,该函数将失败,而 TimeSpan 将继续存在。

于 2013-01-02T06:45:04.273 回答
0

这可能会有所帮助 - 减去时间部分等的好例子。您可以添加/求和...:

Select start_date, end_date, time_diff,
   EXTRACT(DAY FROM time_diff) days,
   EXTRACT(HOUR FROM time_diff) hours,
   EXTRACT(MINUTE FROM time_diff) minutes,
   EXTRACT(SECOND FROM time_diff) seconds
From
(
Select start_date, end_date, end_date - start_date time_diff
From
(
Select CAST(to_date('21/02/2012 06:10:00 am', 'dd/mm/yyyy  hh:mi:ss am') AS TIMESTAMP)  end_date
     , CAST(to_date('01/01/2012 12:00:00 am', 'dd/mm/yyyy  hh:mi:ss am') AS TIMESTAMP) start_date
From dual
))
/
于 2013-01-02T21:37:19.943 回答
0

这将生成一个有效的 .NET 时间戳。代码虽然没有优化。

create function [dbo].to_timespan(@secs as int) returns nvarchar(16)
begin
    declare @mins int, @hours int, @days int;
    set @days = @secs / (60 * 60 * 24);
    set @secs = @secs - @days * (60 * 60 * 24); 
    set @hours = @secs / (60 * 60);
    set @secs = @secs - @hours * (60 * 60);
    set @mins = @secs / 60;
    set @secs = @secs - @mins * 60;
    return replace(str(@days, 2) + '.' + str(@hours, 2) + ':' + str(@mins, 2) + ':' + str(@secs, 2), ' ', '0');
end
GO
于 2014-01-20T15:29:24.713 回答
0

从两个 DATETIME 值的差异返回 HH:MM:SS 字符串输出的最简单方法是使用内置的 T-SQL 日期/时间函数。

DECLARE
    @Start_Date DATETIME = DATEADD(SECOND, -86399, GETDATE())
  , @End_Date DATETIME = GETDATE();


SELECT 
    CONVERT (VARCHAR(8), 
    DATEADD(SECOND, DATEDIFF(SECOND, @Start_Date, @End_Date), 0), 108) 
    AS ElapsedHHMMSS;

输出:23:59:59

但是请注意,如果您处理的时间超过 1 天,您可能需要除 HH:MM:SS 之外的不同输出。这在 24 小时后达到最大值,但 24:00:01 无论如何都不适用于这种格式。上面的其他一些响应将产生无效的 24:00:01 输出。

于 2016-02-19T23:39:12.060 回答
-1
    select to_char(to_date(90,'sssss'),'hh24:mi:ss') from dual;

试试这个伙伴

于 2013-01-02T04:33:52.473 回答