Les jobs SQL Server Agent sont l’épine dorsale de la maintenance automatisée des bases de données : sauvegardes, reconstructions d’index, vérifications d’intégrité, pipelines ETL. Savoir d’un coup d’œil quand chaque job s’est exécuté pour la dernière fois et combien de temps il a duré est essentiel pour une surveillance quotidienne rapide, surtout lors de la gestion de plusieurs instances. Cette requête lit directement depuis les tables système de l’Agent dans msdb et retourne la dernière heure d’exécution et la durée de chaque job.
Comment ça fonctionne
La requête fait une jointure entre msdb..sysjobs (définitions des jobs) et msdb..sysjobhistory (historique d’exécution), trouve la dernière exécution pour chaque job, et formate la durée depuis le format entier interne de SQL Server (HHMMSS empaqueté comme entier) en une chaîne lisible HH:MM:SS. Elle retourne également la durée décomposée en minutes et secondes pour un filtrage facile.
SELECT
job_id,
job_name,
run_datetime,
SUBSTRING(run_duration, 1, 2) + ':' +
SUBSTRING(run_duration, 3, 2) + ':' +
SUBSTRING(run_duration, 5, 2) AS run_duration_hms,
CONVERT(INT, SUBSTRING(run_duration, 1, 2)) * 60 +
CONVERT(INT, SUBSTRING(run_duration, 3, 2)) AS duration_min,
CONVERT(FLOAT, SUBSTRING(run_duration, 5, 2)) AS duration_sec
FROM
(
SELECT
j.job_id,
j.name AS job_name,
DATEADD(hh, -7, run_datetime) AS run_datetime,
run_duration = RIGHT('000000' + CONVERT(VARCHAR(6), h.run_duration), 6)
FROM
(
SELECT
j.name AS job_name,
run_datetime = MAX(
CONVERT(DATETIME, RTRIM(run_date)) +
(run_time * 9 + run_time % 10000 * 6 + run_time % 100 * 10) / 216e4
)
FROM msdb..sysjobhistory h
INNER JOIN msdb..sysjobs j ON h.job_id = j.job_id
GROUP BY j.name
) t
INNER JOIN msdb..sysjobs j ON t.job_name = j.name
INNER JOIN msdb..sysjobhistory h
ON j.job_id = h.job_id
AND t.run_datetime = CONVERT(DATETIME, RTRIM(h.run_date)) +
(h.run_time * 9 + h.run_time % 10000 * 6 + h.run_time % 100 * 10) / 216e4
) dt
-- Décommenter pour filtrer par job spécifique :
-- WHERE job_id = @job_id
ORDER BY run_datetime DESC;
Le décalage DATEADD(hh, -7, ...) ajuste pour un fuseau horaire UTC+7 — supprimez-le ou ajustez-le selon la configuration de fuseau horaire de votre serveur. Pour filtrer les jobs qui ont duré plus longtemps que prévu, ajoutez une clause WHERE duration_min > N.








