sql >> Base de Datos >  >> RDS >> Sqlserver

Formatee las columnas de fecha, hora y duración de sysjobhistory en SQL Server

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: