Преобразовать чч: мм в минуты на SQL сервере - PullRequest
2 голосов
/ 24 января 2020

У меня есть данные, поступающие из исходной системы, которая отправляет время в формате чч: мм nvarchar. Я пытаюсь преобразовать это в минуты. Я только хочу сделать это в Отчете SSRS согласно потребности. Итак, я ищу выражение SSRS, а не T- SQL.

Вот как выглядят мои данные:

10:00
-2:00
-11:30

Ожидаемый результат:

600
-120
-690

Вот то, что я пробовал до сих пор, но ищу лучший / эффективный способ

SUM(CInt(LEFT(Replace(Fields!HHMM.Value, "-", ""),InStrRev(Replace(Fields!HHMM.Value, "-", ""),":")-1))*60 + 
CInt(RIGHT(Replace(Fields!HHMM.Value, "-", ""),InStrRev(Replace(Fields!HHMM.Value, "-", ""),":")))
)

Спасибо!

Ответы [ 5 ]

2 голосов
/ 24 января 2020

Вот что-то похожее на то, что сделал forpas в синтаксисе SSRS.

=LEFT(Fields!TIME.Value, INSTR(Fields!TIME.Value, ":") - 1) * 60 + 
    IIF(LEFT(Fields!TIME.Value, 1) = "-", -1, 1) * 
    MID(Fields!TIME.Value, INSTR(Fields!TIME.Value, ":") + 1, 10)
1 голос
/ 29 января 2020

Вот что сработало в моем случае, который также обрабатывает (нулевые) значения в SSRS.

IIF(Left(Fields!TIME.Value, 1) = "-", "-", "") &  
Right("000" & CInt(Replace(LEFT(Replace(Fields!TIME.Value, "-", ""), (INSTR(Replace(Fields!TIME.Value, "-", ""), ":"))), ":", "")) * 60 + 

CInt(IIF(IsNumeric(MID(Fields!TIME.Value, INSTR(Fields!TIME.Value, ":") + 1, 10)), 
                    MID(Fields!TIME.Value, INSTR(Fields!TIME.Value, ":") + 1, 10), 
                    Nothing
        ))
, 3)
1 голос
/ 25 января 2020

Вы можете использовать скалярную функцию

CREATE FUNCTION fn_To_Min
(
    @timeVar nvarchar(10)
)
RETURNS int
AS
BEGIN

    declare @op char(1) = SUBSTRING(@timeVar, 1, 1)
    if(@op = '-')
    begin
        set @timeVar = SUBSTRING(@timeVar, 2, LEN(@timeVar))
    end
    else
        set @op = ''

    declare @time time = CONVERT( TIME, @timeVar )

    declare @h int = DATEPART(hh, @time)
    declare @m int = DATEPART(Minute, @time)

    RETURN CONVERT(int, CONCAT(@op, (@h * 60) + @m))

END

Вызов

SELECT fn_To_Min('10:25'), col1, col2, ...
1 голос
/ 24 января 2020

Это может делать то, что вы хотите:

В TSQL:

select (case when CONVERT(integer,Replace('-11:30',':','')) < 0 then -1 else 1 end ) * ((DATEPART(HOUR,CONVERT(Datetime,Replace('-11:30','-',''))) * 60) + DATEPART(MINUTE,CONVERT(Datetime,Replace('-11:30','-',''))))

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

Вы можете перевести TSQL Запрос, который я отправил на что-то подобное, чтобы использовать его в SSRS (обратите внимание, что я не проверял код SSRS):

Switch(Cint(Replace(Fields!timeField.Value,":","")) < 0,-1,Cint(Replace(Fields!timeField.Value,":","")) >= 0,1) * ((Hour(cdate(Replace(Fields!timeField.Value,":",""))) * 60 ) + Minute(cdate(Replace(Fields!timeField.Value,":",""))))
0 голосов
/ 24 января 2020

Со строковыми функциями и приведением к целому числу:

select
  cast(left(timecol, charindex(':', timecol) - 1) as int) * 60 +
  case when left(timecol, 1) = '-' then -1 else 1 end *
  cast(substring(timecol, charindex(':', timecol) + 1, len(timecol)) as int)
from tablename

или без приведения путем неявного преобразования в целое число:

select
  left(timecol, charindex(':', timecol) - 1) * 60 +
  case when left(timecol, 1) = '-' then -1 else 1 end *
  substring(timecol, charindex(':', timecol) + 1, len(timecol))
from tablename

Замените timecol фактическим именем столбца. Смотрите демо . Результаты:

 600
-120
-690
...