Преобразовать VARCHAR из ЧЧ: ММ: СС в значение минут - PullRequest
1 голос
/ 28 апреля 2020

Используя SQL Сервер, у меня есть столбец с varchar данными, поступающими из другого источника, отформатированными в псевдо-ЧЧ: ММ: строка SS, представляющая длительность, например:

Duration
HH:MM:SS
00:43:46
01:30:06
43:56:38
89:24:00
5890:01:00

Я хотел чтобы преобразовать его в простое значение минут (int) для каждого

Duration    MinuteDuration
HH:MM:SS    mm
00:43:46    43
01:30:06    90
43:56:38    2636
89:24:00    5364
5890:01:00  353401

Я осмотрел stackoverflow и нашел несколько человек, предлагающих CONVERT с параметром TIME

    USE [MyDB]
    GO

    SELECT [User],
          [Duration],
          (SELECT CONVERT(TIME, Duration, 8)) as DurationMinutes,
      FROM [dbo].[MyTable]

    GO

, но я не могу используйте это, так как мои значения часов могут быть больше, чем 24/12 (мое значение часов может быть в тысячах). Поскольку исходные данные находятся в varchar, мне нужно сначала интерпретировать строку, затем умножить часы на 60 * и добавить ее к значению минут (и просто сбросить значение секунд).

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Хотя анализ компонентов времени, безусловно, возможен, манипулирование строками тоже довольно простое:

select duration,
       (convert(int, left(duration, charindex(':', duration) - 1)) * 60 +
        convert(int, left(right(duration, 5), 2))
       )
from t;

Здесь - это дб <> скрипка.

1 голос
/ 28 апреля 2020

Другой вариант - ParseName() совместно с CROSS APPLY

Пример

Declare @YourTable Table ([Duration] varchar(50))
Insert Into @YourTable Values 
 ('00:43:46')
,('01:30:06')
,('43:56:38')
,('89:24:00')
,('5890:01:00')

Select A.Duration
      ,Minutes = parsename(NewValue,2) + (parsename(NewValue,3)*60)
 from @YourTable A
 Cross Apply ( values (replace(Duration,':','.') ) ) B(NewValue) 

Возвращает

Duration    Minutes
00:43:46    43
01:30:06    90
43:56:38    2636
89:24:00    5364
5890:01:00  353401
...