Monitoreo de trabajos SQL: verificar la fecha y hora de la última ejecución y la duración

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.