В MS Reporting Services 2008 у меня есть поле, которое длится в секундах. Есть ли пятно способ получить его в формате hh: mm: ss в групповом разделе отчета?
Как отобразить временной интервал в секундах в формате hh: mm: ss в Reporting Services
Ответ 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. Это также можно было бы сделать в уже вычисленных полях (и, возможно, было бы более правильным сделать это:)) - однако я предпочел использовать вышеупомянутый подход.
Таким образом, я смог по-прежнему форматировать очень большое количество секунд, которое превышает целочисленные типы.