Si vous avez déjà interrogé le sysjobhistory
table dans le msdb
base de données, vous saurez probablement que les colonnes datetime et duration sont stockées sous forme d'entiers.
En particulier, lorsque vous interrogez cette table, la run_date
, run_time
, et duration
les colonnes sont renvoyées sous forme d'entiers, ce qui peut rendre la lecture difficile.
Vous trouverez ci-dessous une requête que vous pouvez utiliser pour renvoyer ces données dans un format plus facile à lire.
Le problème
Voyons d'abord comment ces colonnes sont renvoyées :
SELECT TOP 15
run_date,
run_time,
run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Résultat :
run_date run_time run_duration 20201215 155451 625 20201215 155948 128 20201115 20001 17 20201115 20002 16 20201218 44026 13 20201217 20000 10 20201218 44029 10 20201216 21902 9 20201217 20001 9 20201219 23527 9 20201213 34249 8 20201216 21903 8 20201219 23528 8 20201213 34250 7 20201214 32114 7
Voici comment chaque colonne est stockée/présentée :
- La
run_date
colonne est stockée au format AAAAMMJJ. - Le
run_time
La colonne est stockée au format HHMMSS sur une horloge de 24 heures. Mais il n'y a pas de zéros non significatifs. - La
run_duration
colonne est stockée au format HHMMSS. Encore une fois, il n'y a pas de zéros non significatifs. De plus, il n'y a pas de deux-points pour nous aider à distinguer chaque segment. Ainsi, dans l'exemple ci-dessus, la première tâche s'est terminée en 6 minutes et 25 secondes, la deuxième s'est terminée en 1 minute et 28 secondes et la troisième s'est terminée en 17 secondes.
Une fois que vous savez comment fonctionne le formatage, il n'est généralement pas trop difficile de le comprendre. Mais cela peut être peu intuitif pour nous, les humains, à lire.
La solution
Voici une solution qui présente les données dans un format plus lisible :
SELECT TOP 15
msdb.dbo.AGENT_DATETIME(run_date, run_time) AS RunDateTime,
STUFF(STUFF(STUFF(RIGHT(REPLICATE('0', 8) + CAST(run_duration as varchar(8)), 8), 3, 0, ':'), 6, 0, ':'), 9, 0, ':') AS RunDuration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Résultat :
RunDateTime RunDuration 2020-12-15 15:54:51.000 00:00:06:25 2020-12-15 15:59:48.000 00:00:01:28 2020-11-15 02:00:01.000 00:00:00:17 2020-11-15 02:00:02.000 00:00:00:16 2020-12-18 04:40:26.000 00:00:00:13 2020-12-17 02:00:00.000 00:00:00:10 2020-12-18 04:40:29.000 00:00:00:10 2020-12-16 02:19:02.000 00:00:00:09 2020-12-17 02:00:01.000 00:00:00:09 2020-12-19 02:35:27.000 00:00:00:09 2020-12-13 03:42:49.000 00:00:00:08 2020-12-16 02:19:03.000 00:00:00:08 2020-12-19 02:35:28.000 00:00:00:08 2020-12-13 03:42:50.000 00:00:00:07 2020-12-14 03:21:14.000 00:00:00:07
Ici, j'utilise le non documenté AGENT_DATETIME()
fonction pour convertir la run_date
et run_time
colonnes dans un format plus lisible.
J'utilise ensuite une série de fonctions T-SQL (STUFF()
, RIGHT()
, CAST()
, et REPLICATE()
) pour obtenir la run_duration
colonne dans un format plus lisible par l'homme. Ceux-ci garantissent que des deux-points sont insérés à un endroit approprié et qu'il y a toujours deux chiffres (y compris un zéro de début si nécessaire) pour chaque segment.
Plus de mise en forme
Vous pouvez aller plus loin et utiliser d'autres fonctions, telles que le FORMAT()
fonction pour présenter la run_date
et run_time
colonnes dans un format encore plus convivial.
SELECT TOP 15
FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Résultat :
RunDateTime Tuesday, December 15, 2020 11:54:51 PM Tuesday, December 15, 2020 11:59:48 PM Sunday, November 15, 2020 10:00:01 AM Sunday, November 15, 2020 10:00:02 AM Friday, December 18, 2020 12:40:26 PM Thursday, December 17, 2020 10:00:00 AM Friday, December 18, 2020 12:40:29 PM Wednesday, December 16, 2020 10:19:02 AM Thursday, December 17, 2020 10:00:01 AM Saturday, December 19, 2020 10:35:27 AM Sunday, December 13, 2020 11:42:49 AM Wednesday, December 16, 2020 10:19:03 AM Saturday, December 19, 2020 10:35:28 AM Sunday, December 13, 2020 11:42:50 AM Monday, December 14, 2020 11:21:14 AM
Vous pouvez utiliser n'importe quel nombre d'autres spécificateurs de format avec cette fonction, ainsi qu'un argument de culture.
Pour plus d'informations et d'exemples, consultez :
- Comment formater la date et l'heure dans SQL Server
- Chaînes de format de date et d'heure standard
- Chaînes de format de date et d'heure personnalisées
Obtenir le nom de la tâche
Le sysjobhistory
table ne stocke pas les noms de travail. Il ne stocke que leurs identifiants.
Pour renvoyer le nom du travail avec les données de date/heure/durée, vous pouvez effectuer une jointure sur sysjobs_view
vue (ou la vue sysjobs
table) pour obtenir le nom du travail.
Voici un exemple de requête qui fait cela :
SELECT jv.name AS Job,
jh.step_name AS Step,
msdb.dbo.AGENT_DATETIME(jh.run_date, jh.run_time) AS RunDateTime,
STUFF(STUFF(STUFF(RIGHT(REPLICATE('0', 8) + CAST(jh.run_duration as varchar(8)), 8), 3, 0, ':'), 6, 0, ':'), 9, 0, ':') AS RunDuration
FROM msdb.dbo.sysjobs_view jv
INNER JOIN msdb.dbo.sysjobhistory jh
ON jv.job_id = jh.job_id
ORDER BY Job, RunDateTime;
Résultat :