TSQL конвертировать VARCHAR в ВРЕМЯ

У меня есть поле VARCHAR с примерами значений, перечисленных ниже, и я хочу преобразовать его в формат ЧЧ: ММ: СС. Предложения?

151200
085800
080100
210100
083300

4 ответа

Решение

На Sql-сервере попробуйте это:

declare @t varchar(10) 
set @t='151200'

select left(@t,2) + ':' + substring(@t,3,2) + ':' + right(@t,2)
Declare @YourTable table (TimeStr varchar(25))
Insert Into @YourTable values
('151200'),
('085800'),
('080100'),
('210100'),
('083300')


Select *
      ,AsTime = cast(stuff(stuff(TimeStr,5,0,':'),3,0,':') as time)
 From @YourTable

Возвращает

TimeStr AsTime
151200  15:12:00.0000000
085800  08:58:00.0000000
080100  08:01:00.0000000
210100  21:01:00.0000000
083300  08:33:00.0000000

РЕДАКТИРОВАТЬ:

В зависимости от вашей версии, учитывая, что вы храните значения времени в varchar (что означает, что вы можете иметь поддельные данные), вы можете использовать:

try_convert(time,stuff(stuff(TimeStr,5,0,':'),3,0,':'))

Если вы используете SQL Server 2012 или выше и хотите сохранить значения как фактические типы данных TIME, вы можете использовать функцию TIMEFROMPARTS.

Например:

DECLARE @d VARCHAR(10)
SET @d = '151200'

SELECT TIMEFROMPARTS(LEFT(@d,2), SUBSTRING(@d,3,2), RIGHT(@d,2), 0)

Это вернет ВРЕМЯ. Для получения дополнительной информации, пожалуйста, смотрите это: https://msdn.microsoft.com/en-us/library/hh213398.aspx

Если время хранится как INT, в SQL Server 2019 хорошо работает следующее:

      DECLARE @time INT = 912;

SELECT TRY_CONVERT(time, FORMAT(@time, '00:00:00'))

Это также позволяет извлекать секунды со следующими

      SELECT DATEDIFF(second, 0, TRY_CONVERT(time, FORMAT(@time, '00:00:00'))) 

А при работе с msdb.dbo.sysjobhistoryкоторый по какой-то причине хранит run_duration как INT в этом формате hhmmss

      SELECT duration_seconds = DATEDIFF(second, 0, TRY_CONVERT(time, FORMAT(run_duration, '00:00:00')))
,duration_time = TRY_CONVERT(time, FORMAT(run_duration, '00:00:00'))
, * FROM msdb.dbo.sysjobhistory
Другие вопросы по тегам