如何HH:MM:SS
在 SQL Server 中将秒(int)转换为格式?
例如 90 应该输出 => 00:01:30
更新
我有两个日期START_DATE
和ENDDATE
。
我想要这些日期的差异
最后我想总结一下HH:MM:SS
格式上的这些差异
小提琴: http ://sqlfiddle.com/#!3/39c2b/1/0
如何HH:MM:SS
在 SQL Server 中将秒(int)转换为格式?
例如 90 应该输出 => 00:01:30
更新
我有两个日期START_DATE
和ENDDATE
。
我想要这些日期的差异
最后我想总结一下HH:MM:SS
格式上的这些差异
小提琴: http ://sqlfiddle.com/#!3/39c2b/1/0
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');
例如看这里的例子
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')
您指的是TIMESPAN
SQL中的概念。但是,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 将继续存在。
这可能会有所帮助 - 减去时间部分等的好例子。您可以添加/求和...:
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
))
/
这将生成一个有效的 .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
从两个 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 输出。
select to_char(to_date(90,'sssss'),'hh24:mi:ss') from dual;
试试这个伙伴