Làm thế nào để chuyển đổi Giây sang HH: MM: SS bằng T-SQL


Câu trả lời:


142

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)

3
CHỌN CHUYỂN ĐỔI (varchar, DATEADD (ms, 121,25 * 1000, 0), 114) là nó.
Brett Veenstra

20
Điều này sẽ không hoạt động nếu bạn có nhiều hơn 24 giờ giá trị của giây
JamWheel

21
Rât gọn gang. Sử dụng 108 nếu bạn không muốn mili giây, tức là hh: mi: ss
stuartd

8
Nếu bạn có SQL 2008+ và chỉ muốn phần thời gian; thay vì chuyển đổi thành varchar: CHỌN CHUYỂN ĐỔI (thời gian, DATEADD (mili giây, 121,25 * 1000, 0))
Eric Humphrey

47

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

Tại sao thời gian dài hơn sau đó 24 giờ sẽ không được định dạng chính xác bằng DateAdd?
gotqn

5
@gotqn: DateAdd () không phải là vấn đề. Convert () là vấn đề. Convert () kết thúc hiệu quả về 0 sau mỗi 24 giờ. Nếu bạn sử dụng Convert () để định dạng khoảng thời gian 27 giờ, nó sẽ trả về "03:00:00".
Mike Sherrill 'Cat Recall'

Làm thế nào để xử lý các định dạng này nếu các trường hợp sử dụng cho biết kết quả có thể hh tiêu cực: mm: ss (ví dụ -340: 23: 34, 03: -4: 05,13: 54: -8 vv.)
OmGanesh

1
Đây là con đường để đi. Không có giải pháp nào khác ở đây sẽ hoạt động bình thường để định dạng HHMMSS sau 24 giờ. Điều này cũng sẽ giúp giữ cho các truy vấn của bạn gọn gàng.
Krummelz

27

Đố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"

21
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

1
Đây phải là câu trả lời được chấp nhận - nó giải quyết vấn đề second, như OP đã hỏi, tránh sử dụng một cách không hiệu quả scalar functionvà 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à dotthay vì colon. Vì vậy, ví dụ 2.01:03:04cho 2 ngày, 1 giờ, 3 phút, 4 giây. Chúc mừng!
NateJ


4

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')

1
điều này đã không làm việc cho tôi. nếu bạn vượt qua 896434 giây - bạn muốn 10: 09: 00: 34: 000 chứ không phải 249: 00: 34
Marcello Miorelli

1
SELECT substring(convert (varchar(23),Dateadd(s,10000,LEFT(getdate(),11)),121),12,8)

10000 là giá trị của bạn tính bằng giây


1
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)

1

Đâ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

0
DECLARE @Seconds INT = 86200;
SELECT 
CONVERT(VARCHAR(15), 
CAST(CONVERT(VARCHAR(12), @Seconds / 60 / 60 % 24)
+':'+ CONVERT(VARCHAR(2), @Seconds / 60 % 60)
+':'+ CONVERT(VARCHAR(2), @Seconds % 60) AS TIME), 100) AS [HH:MM:SS (AM/PM)]

nhập mô tả hình ảnh ở đây


0

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.