Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Formater les colonnes datetime et durée de sysjobhistory dans SQL Server

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 :