Как отобразить временной интервал в секундах в формате hh: mm: ss в Reporting Services

В MS Reporting Services 2008 у меня есть поле, которое длится в секундах. Есть ли пятно способ получить его в формате hh: mm: ss в групповом разделе отчета?

Ответ 1

Если вы просто хотите его отобразить, конвертируйте в выражение для значения текстового поля:

=Format(DateAdd("s", Fields!MySecondsField.Value, "00:00:00"), "HH:mm:ss")

Если вы хотите выполнить вычисления на нем, преобразуйте секунды в DateTime в свой набор данных. Использование SQL:

SELECT DATEADD(ss, MySecondsField, '1900-01-01') AS SecondsAsDateTime
FROM TimeTable

В Linq это будет что-то вроде:

var qry = from Q in t.TimeList
    select new
    {
        SecondsAsDateTime = DateTime.Today.AddSeconds(Q.MySecondsField) 
    };

Затем вы можете просто форматировать его как обычное DateTime.

Ответ 2

Если вам нужно работать со временем дольше 24 часов (решение Chris Latta в этих случаях будет закрыто), тогда есть несколько решений.

Простая формула

Если вы хотите просто использовать формулу в поле, такую ​​как этот поток, который также ссылается на этот вопрос)!

=int(sum(Fields!Sec_Online.Value)/3600) & ":" & int((sum(Fields!Sec_Online.Value) Mod 3600)/60) & ":" & (sum(Fields!Sec_Online.Value) Mod 3600) Mod 60

Если вам нужно отложить свое значение до 2 символов, вы можете обернуть RIGHT("0" & {X}, 2) вокруг каждого подраздела, где {x} указывает один из отдельных вычислений в приведенной выше формуле.

Код за

Другой подход, предложенный в этом потоке, заключается в использовании TimeSpan.FromSeconds (doc), и есть реализация этого на этом , используя специальный код в отчете.

В итоге я использовал подход с использованием пользовательского кода (так как у меня было много полей, разделяющих это), и сочетая его с чем-то более похожим на первый метод, так как я не хотел, чтобы дни начали появляться, я просто хотел, чтобы часы подсчитывали больше чем 23.

Я добавил в отчет какой-то пользовательский код для отчета, который заполняет все значения не менее чем двумя символами и позволяет часами отсчитывать часы > 23.

Public Function ConvertSecondsToHourMinSec(ByVal intTotalSeconds) As String
    Dim hours As String =INT(intTotalSeconds/3600)
    If Len(hours) < 2 Then
        hours = RIGHT(("0" & hours), 2)
    End If
    Dim mins As String = RIGHT("0" & INT((intTotalSeconds MOD 3600)/60), 2)
    Dim secs AS String = RIGHT("0" & ((intTotalSeconds MOD 3600) MOD 60), 2)

    ConvertSecondsToHourMinSec = hours & ":" & mins & ":" & secs

End Function

а затем вызвал это из каждой ячейки в вопросах следующим образом:

=code.ConvertSecondsToHourMinSec(Fields!MyField.Value)

Я надеюсь, что это поможет кому-то еще!

Ответ 3

Используйте выражение ниже, замените жирным шрифтом поле, содержащее переменную секунд.

= DateAdd (DateInterval.Second, Сумма (поля! totalDuration.Value), CDate ( "1900-01-01 00:00:00" ))

Я всегда применяю форматирование в свойствах текстового поля -

H "h" m "m" s "s" будет отображаться как "2h 16m 5s"

Ответ 4

используйте такую ​​функцию:

Public Function ConvertTsToHMS(myValue As long) As String
    'Dim ts as TimeSpan = TimeSpan.FromTicks(myValue)
    Dim ts as TimeSpan = TimeSpan.FromSeconds(myValue)

    return Int(ts.TotalHours).ToString("00") + ":" + Int(ts.Minutes).ToString("00") + ":" + ts.Seconds.ToString("00")

End Function

Ответ 5

Я недавно использовал идею Xan и из-за того, что количество секунд, которые у меня есть, довольно велико - у меня закончилось ограничение целочисленного типа. Поэтому я разработал другой подход - возможно, кому-то это будет полезно:)

Мне нужно было создать рассчитанные поля для часов, минут и секунд - использовались следующие формулы:

  • XXXNumberOfHours = int (Поля! TimeInSec.Value/3600)
  • XXXNumberOfMinutes = int ((Fields! TimeInSec.Value Mod 3600)/60)
  • XXXNumberOfSeconds = = ((Поля! TimeInSec.Value Mod 3600) Mod 60)

Затем я создал выражение для отображения секунд в формате HH: MM: SS (без дней - не нужно):

  • (Sum(Fields!LWTNumberOfHours.Value)+int((Sum(Fields!LWTNumberOfMinutes.Value) + int(Sum(Fields!LWTNumberOfSeconds.Value)/60))/60))
  • & ":" &
  • right("0" & (Sum(Fields!LWTNumberOfMinutes.Value) + int(Sum(Fields!LWTNumberOfSeconds.Value)/60)) Mod 60, 2)
  • & ":" &
  • right("0" & Sum(Fields!LWTNumberOfSeconds.Value) Mod 60, 2)

В приведенных выше строках вы можете видеть, что строка (1) вычисляет количество часов, строка (3) вычисляет количество минут, а строка (5) вычисляет количество секунд. Конечно, вы можете заметить, что сделаны дополнительные вычисления, чтобы получить количество полных минут из XXNumberOfSeconds, и то же самое относится к Minutes/Hours. Это также можно было бы сделать в уже вычисленных полях (и, возможно, было бы более правильным сделать это:)) - однако я предпочел использовать вышеупомянутый подход.

Таким образом, я смог по-прежнему форматировать очень большое количество секунд, которое превышает целочисленные типы.