Tình hình là bạn có một giá trị tính bằng Giây (XXX.XX) và bạn muốn chuyển đổi sang HH: MM: SS bằng T-SQL.
Thí dụ:
- 121,25 s trở thành 00: 02: 01.25
Tình hình là bạn có một giá trị tính bằng Giây (XXX.XX) và bạn muốn chuyển đổi sang HH: MM: SS bằng T-SQL.
Thí dụ:
Câu trả lời:
Bạn muốn nhân ra mili giây vì phần phân số bị loại bỏ.
SELECT DATEADD(ms, 121.25 * 1000, 0)
Nếu bạn muốn nó mà không có phần ngày, bạn có thể sử dụng CONVERT, với kiểu 114
SELECT CONVERT(varchar, DATEADD(ms, 121.25 * 1000, 0), 114)
Nếu lượng thời gian của bạn vượt quá 24 giờ, nó sẽ không được xử lý chính xác bằng các phương pháp DATEADD và CONVERT.
SELECT CONVERT(varchar, DATEADD(ms, 24*60*60 * 1000, 0), 114)
00:00:00:000
Chức năng sau sẽ xử lý thời gian vượt quá 24 giờ (~ tối đa 35,791,394 giờ).
create function [dbo].[ConvertTimeToHHMMSS]
(
@time decimal(28,3),
@unit varchar(20)
)
returns varchar(20)
as
begin
declare @seconds decimal(18,3), @minutes int, @hours int;
if(@unit = 'hour' or @unit = 'hh' )
set @seconds = @time * 60 * 60;
else if(@unit = 'minute' or @unit = 'mi' or @unit = 'n')
set @seconds = @time * 60;
else if(@unit = 'second' or @unit = 'ss' or @unit = 's')
set @seconds = @time;
else set @seconds = 0; -- unknown time units
set @hours = convert(int, @seconds /60 / 60);
set @minutes = convert(int, (@seconds / 60) - (@hours * 60 ));
set @seconds = @seconds % 60;
return
convert(varchar(9), convert(int, @hours)) + ':' +
right('00' + convert(varchar(2), convert(int, @minutes)), 2) + ':' +
right('00' + convert(varchar(6), @seconds), 6)
end
Sử dụng:
select dbo.ConvertTimeToHHMMSS(123, 's')
select dbo.ConvertTimeToHHMMSS(96.999, 'mi')
select dbo.ConvertTimeToHHMMSS(35791394.999, 'hh')
0:02:03.000
1:36:59.940
35791394:59:56.400
Đối với những người gặp vấn đề với việc sử dụng DATEADD và CONVERT trong số giây vượt quá 24 giờ, chúng tôi có thể sử dụng mô-đun để khắc phục điều đó:
SELECT CONVERT(varchar, @seconds / 86400 ) + ':' + -- Days
CONVERT(varchar, DATEADD(ms, ( @seconds % 86400 ) * 1000, 0), 114)
as "Converted to D:HH:MM:SS.MS"
DECLARE @seconds AS int = 896434;
SELECT
CONVERT(varchar, (@seconds / 86400)) --Days
+ ':' +
CONVERT(varchar, DATEADD(ss, @seconds, 0), 108); --Hours, Minutes, Seconds
Kết quả đầu ra:
10:09:00:34
second
, như OP đã hỏi, tránh sử dụng một cách không hiệu quả scalar function
và xử lý các khoảng thời gian nhiều ngày một cách thích hợp. Điểm nhỏ duy nhất mà tôi muốn bổ sung là, trong vùng đất của SQL Agent, thời gian / khoảng thời gian đã trôi qua của bạn cho phần "ngày" thường sử dụng "days.hh: mm: ss", tức là dot
thay vì colon
. Vì vậy, ví dụ 2.01:03:04
cho 2 ngày, 1 giờ, 3 phút, 4 giây. Chúc mừng!
Sử dụng SQL Server 2008
declare @Seconds as int = 3600;
SELECT CONVERT(time(0), DATEADD(SECOND, @Seconds, 0)) as 'hh:mm:ss'
Sử dụng SQL Server 05, tôi có thể làm cho điều này hoạt động bằng cách sử dụng:
declare @OrigValue int;
set @OrigValue = 121.25;
select replace(str(@OrigValue/3600,len(ltrim(@OrigValue/3600))+abs(sign(@OrigValue/359999)-1)) + ':' + str((@OrigValue/60)%60,2) + ':' + str(@OrigValue%60,2),' ','0')
DECLARE @TimeinSecond INT
SET @TimeinSecond = 340 -- Change the seconds
SELECT RIGHT('0' + CAST(@TimeinSecond / 3600 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST((@TimeinSecond / 60) % 60 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST(@TimeinSecond % 60 AS VARCHAR),2)
Đây là những gì tôi sử dụng (thường cho báo cáo email bảng html)
declare @time int, @hms varchar(20)
set @time = 12345
set @hms = cast(cast((@Time)/3600 as int) as varchar(3))
+':'+ right('0'+ cast(cast(((@Time)%3600)/60 as int) as varchar(2)),2)
+':'+ right('0'+ cast(((@Time)%3600)%60 as varchar(2)),2) +' (hh:mm:ss)'
select @hms
Bạn có thể thử cái này
set @duration= 112000
SELECT
"Time" = cast (@duration/3600 as varchar(3)) +'H'
+ Case
when ((@duration%3600 )/60)<10 then
'0'+ cast ((@duration%3600 )/60)as varchar(3))
else
cast ((@duration/60) as varchar(3))
End