Si alguna vez ha consultado el sysjobhistory
tabla en el msdb
base de datos, probablemente sabrá que las columnas de fecha y hora y duración se almacenan como números enteros.
En particular, cuando consulta esta tabla, la run_date
, run_time
y duration
las columnas se devuelven como números enteros, lo que puede dificultar su lectura.
A continuación se muestra una consulta que puede utilizar para devolver estos datos en un formato más fácil de leer.
El problema
Primero, veamos cómo se devuelven estas columnas:
SELECT TOP 15
run_date,
run_time,
run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Resultado:
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
Así es como se almacena/presenta cada columna:
- La
run_date
la columna se almacena en formato AAAAMMDD. - El
run_time
La columna se almacena en formato HHMMSS en un reloj de 24 horas. Pero no hay ceros a la izquierda. - La
run_duration
la columna se almacena en formato HHMMSS. Una vez más, no hay ceros a la izquierda. Además, no hay dos puntos que nos ayuden a distinguir entre cada segmento. Entonces, en el ejemplo anterior, el primer trabajo terminó en 6 minutos y 25 segundos, el segundo trabajo terminó en 1 minuto y 28 segundos y el tercer trabajo terminó en 17 segundos.
Una vez que sepa cómo funciona el formato, generalmente no es demasiado difícil descifrarlo. Pero puede ser poco intuitivo para nosotros los humanos leer.
La solución
Aquí hay una solución que presenta los datos en un formato más legible para los humanos:
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;
Resultado:
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
Aquí, uso el AGENT_DATETIME()
no documentado función para convertir el run_date
y run_time
columnas en un formato más legible.
Luego uso una serie de funciones T-SQL (STUFF()
, RIGHT()
, CAST()
y REPLICATE()
) para obtener la run_duration
columna en un formato más legible por humanos. Esto asegura que haya dos puntos insertados en un lugar adecuado y que siempre haya dos dígitos (incluido un cero inicial si es necesario) para cada segmento.
Más formato
Podría ir un paso más allá y usar otras funciones, como FORMAT()
función para presentar el run_date
y run_time
columnas en un formato que es aún más fácil de leer.
SELECT TOP 15
FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Resultado:
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
Puede usar cualquier número de otros especificadores de formato con esta función, así como un argumento cultural.
Para obtener más información y ejemplos, consulte:
- Cómo formatear la fecha y la hora en SQL Server
- Cadenas de formato de fecha y hora estándar
- Cadenas de formato de fecha y hora personalizado
Obtención del nombre del trabajo
El sysjobhistory
la tabla no almacena nombres de trabajo. Solo almacena sus identificaciones.
Para devolver el nombre del trabajo junto con los datos de fecha/hora/duración, puede realizar una combinación en sysjobs_view
vista (o el sysjobs
table) para obtener el nombre del trabajo.
Aquí hay un ejemplo de una consulta que hace eso:
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;
Resultado: