Comment afficher un laps de temps de quelques secondes au format hh:mm:ss dans Reporting Services
Dans MS Reporting Services 2008, j'ai un champ qui est d'une durée stockés comme des secondes. Est-il un habile façon de l'obtenir en hh:mm:ss dans un groupe de la section du rapport?
Si vous voulez faire des calculs sur elle, convertir les secondes à un DateTime dans votre jeu de données. À l'aide de SQL:
SELECT DATEADD(ss, MySecondsField, '1900-01-01') AS SecondsAsDateTime
FROM TimeTable
Dans Linq, ce serait quelque chose comme:
var qry = from Q in t.TimeList
select new
{
SecondsAsDateTime = DateTime.Today.AddSeconds(Q.MySecondsField)
};
Alors vous pouvez simplement mettre en forme dans un normal DateTime.
votre "00:00:00" peut être modifiée à 0. Cela fonctionne très bien pour toutes les durées < 24h. Il fonctionne très bien pour unique timespans mais ne fonctionne pas quand vous le souhaitez à l'agrégation des résultats
Si vous avez besoin de travailler avec des temps de plus de 24 heures (Chris Latta la solution enveloppant dans ces cas), alors il ya un couple de solutions.
Formule Simple
Si vous voulez juste utiliser une formule sur le terrain, comme la suite de ce fil, (qui a aussi des liens pour en revenir à cette question)!
=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
Si vous avez besoin pour remplir votre valeur à 2 caractères que vous pouvez emballer un RIGHT("0" & {X}, 2) autour de chaque sous-section, où {x} indique les différents calculs dans la formule ci-dessus.
Code Derrière
Une autre approche, également proposé dans ce fil de discussion, est d'utiliser TimeSpan.FromSeconds(doc), et il y a une mise en œuvre de cette sur cette blog, à l'aide d'un code personnalisé à la traîne dans le rapport.
J'ai fini par utiliser le code personnalisé approche (que j'ai eu beaucoup de champs de partage), et de le combiner avec quelque chose de plus comme la première méthode que je ne voulais pas jours pour commencer à apparaître, je voulais juste heures à compter de plus de 23.
J'ai ajouté quelques code personnalisé le rapport comme suit plaquettes de toutes les valeurs d'au moins 2 caractères, et permet des heures à heures à compter jusqu' > 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
et puis il a appelé ce à partir de chaque cellule en question comme suit:
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
J'ai utilisé l'idée de Xan récemment, et en raison du fait que le nombre de secondes que j'ai sont assez grandes - j'ai manqué de type entier limite. J'ai donc conçu une approche différente - peut-être someobody sera utile 🙂
J'avais besoin de créer des champs calculés pour les Heures, Minutes et Secondes - utilisé formules suivantes:
right("0" & (Sum(Fields!LWTNumberOfMinutes.Value) +int(Sum(Fields!LWTNumberOfSeconds.Value)/60)) Mod 60, 2)
& ":" &
right("0" & Sum(Fields!LWTNumberOfSeconds.Value) Mod 60, 2)
Dans les lignes ci-dessus vous pouvez voir que la ligne (1) calcule le nombre d'heures, la ligne (3) calcule le nombre de minutes et de la ligne (5) calcule le nombre de secondes.
Bien sûr, vous pouvez remarquer que d'autres calculs sont effectués pour obtenir le nombre total de minutes de XXNumberOfSeconds et de même pour les Minutes/Heures. Cela pourrait également se faire dans le champs calculés déjà (et il serait peut-être même plus le droit de le faire 🙂 ) - mais j'ai préféré utiliser l'approche décrite ci-dessus.
De cette façon j'ai pu encore le format très grand nombre de secondes qui dépasse entier typesize.
Si vous voulez juste pour l'afficher, de le convertir en une expression de la Valeur de la textbox:
Si vous voulez faire des calculs sur elle, convertir les secondes à un DateTime dans votre jeu de données. À l'aide de SQL:
Dans Linq, ce serait quelque chose comme:
Alors vous pouvez simplement mettre en forme dans un normal DateTime.
Cela fonctionne très bien pour toutes les durées < 24h.
Il fonctionne très bien pour unique timespans mais ne fonctionne pas quand vous le souhaitez à l'agrégation des résultats
OriginalL'auteur Chris Latta
Si vous avez besoin de travailler avec des temps de plus de 24 heures (Chris Latta la solution enveloppant dans ces cas), alors il ya un couple de solutions.
Formule Simple
Si vous voulez juste utiliser une formule sur le terrain, comme la suite de ce fil, (qui a aussi des liens pour en revenir à cette question)!
Si vous avez besoin pour remplir votre valeur à 2 caractères que vous pouvez emballer un
RIGHT("0" & {X}, 2)
autour de chaque sous-section, où{x}
indique les différents calculs dans la formule ci-dessus.Code Derrière
Une autre approche, également proposé dans ce fil de discussion, est d'utiliser
TimeSpan.FromSeconds
(doc), et il y a une mise en œuvre de cette sur cette blog, à l'aide d'un code personnalisé à la traîne dans le rapport.J'ai fini par utiliser le code personnalisé approche (que j'ai eu beaucoup de champs de partage), et de le combiner avec quelque chose de plus comme la première méthode que je ne voulais pas jours pour commencer à apparaître, je voulais juste heures à compter de plus de 23.
J'ai ajouté quelques code personnalisé le rapport comme suit plaquettes de toutes les valeurs d'au moins 2 caractères, et permet des heures à heures à compter jusqu' > 23.
et puis il a appelé ce à partir de chaque cellule en question comme suit:
J'espère que cela aide quelqu'un d'autre!
OriginalL'auteur xan
L'utilisation de l'expression ci-dessous, remplacer le gras avec votre champ contenant les secondes variable.
=DateAdd(DateInterval.Deuxièmement, Somme(Champs!durée totale.Valeur), CDate("1900-01-01 00:00:00"))
J'ai toujours appliquer le formatage dans la zone de texte propriétés-
H"H "m"m "s"s"
affiche "2h 16m 5s"
OriginalL'auteur Chriz
utiliser une fonction comme ceci:
OriginalL'auteur Gildor
J'ai utilisé l'idée de Xan récemment, et en raison du fait que le nombre de secondes que j'ai sont assez grandes - j'ai manqué de type entier limite. J'ai donc conçu une approche différente - peut-être someobody sera utile 🙂
J'avais besoin de créer des champs calculés pour les Heures, Minutes et Secondes - utilisé formules suivantes:
Puis j'ai créé une expression pour afficher les secondes au format HH:MM:SS (sans jours - n'a pas besoin de ça) format:
(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)
Dans les lignes ci-dessus vous pouvez voir que la ligne (1) calcule le nombre d'heures, la ligne (3) calcule le nombre de minutes et de la ligne (5) calcule le nombre de secondes.
Bien sûr, vous pouvez remarquer que d'autres calculs sont effectués pour obtenir le nombre total de minutes de XXNumberOfSeconds et de même pour les Minutes/Heures. Cela pourrait également se faire dans le champs calculés déjà (et il serait peut-être même plus le droit de le faire 🙂 ) - mais j'ai préféré utiliser l'approche décrite ci-dessus.
De cette façon j'ai pu encore le format très grand nombre de secondes qui dépasse entier typesize.
OriginalL'auteur Wojciech Zieliński