Los trabajos del Agente de SQL Server son la columna vertebral del mantenimiento automatizado de bases de datos: copias de seguridad, reconstrucción de índices, comprobaciones de integridad, pipelines ETL. Saber de un vistazo cuándo se ejecutó por última vez cada trabajo y cuánto tardó es esencial para una monitorización diaria ágil, especialmente al gestionar múltiples instancias. Esta consulta lee directamente de las tablas del sistema del Agente en msdb y devuelve la última hora de ejecución y la duración de cada trabajo.
Cómo Funciona
La consulta une msdb..sysjobs (definiciones de trabajos) con msdb..sysjobhistory (historial de ejecuciones), encuentra la ejecución más reciente de cada trabajo y formatea la duración desde el formato entero interno de SQL Server (HHMMSS empaquetado como entero) a una cadena legible HH:MM:SS. También devuelve la duración desglosada en minutos y segundos para facilitar el filtrado.
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
-- Uncomment to filter by a specific job:
-- WHERE job_id = @job_id
ORDER BY run_datetime DESC;
El desplazamiento DATEADD(hh, -7, ...) ajusta la zona horaria UTC+7 — elimínelo o ajústelo según la configuración de zona horaria de su servidor. Para filtrar trabajos que tardaron más de lo esperado, añada una cláusula WHERE duration_min > N.








