Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Форматиране на sysjobhistory дата и време на колони в SQL Server

Ако някога сте питали sysjobhistory таблица в msdb база данни, вероятно ще знаете, че колоните за дата, време и продължителност се съхраняват като цели числа.

По-специално, когато правите заявка към тази таблица, run_date , run_time и duration колоните се връщат като цели числа, което може да затрудни четенето.

По-долу е дадена заявка, която можете да използвате, за да върнете тези данни в по-лесен за четене формат.

Проблемът

Първо, нека разгледаме как се връщат тези колони:

SELECT TOP 15
	run_date,
	run_time,
	run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;

Резултат:

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

Ето как се съхранява/представя всяка колона:

  • run_date колоната се съхранява във формат ГГГГММДД.
  • run_time колоната се съхранява във формат HHMMSS на 24-часов часовник. Но няма водещи нули.
  • run_duration колоната се съхранява във формат HHMMSS. Отново няма водещи нули. Освен това няма двоеточия, които да ни помогнат да разграничим всеки сегмент. Така че в горния пример първото задание приключи за 6 минути и 25 секунди, второто завърши за 1 минута и 28 секунди, а третото завърши за 17 секунди.

След като разберете как работи форматирането, обикновено не е много трудно да го разберете. Но за нас, хората, може да е неинтуитивно да четем.

Решението

Ето решение, което представя данните в по-четлив от човека формат:

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;

Резултат:

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

Тук използвам недокументирания AGENT_DATETIME() функция за преобразуване на run_date и run_time колони в по-четлив формат.

След това използвам серия от T-SQL функции (STUFF() , RIGHT() , CAST() и REPLICATE() ), за да получите run_duration колона в по-четлив от човека формат. Те гарантират, че има поставени двоеточия на подходящо място и че винаги има две цифри (включително водеща нула, ако е необходимо) за всеки сегмент.

Още форматиране

Можете да направите още една крачка напред и да използвате други функции, като FORMAT() функция за представяне на run_date и run_time колони във формат, който е още по-удобен за четене.

SELECT TOP 15
	FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;

Резултат:

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

Можете да използвате произволен брой други спецификатори на формат с тази функция, както и аргумент за култура.

За повече информация и примери вижте:

  • Как да форматирате датата и часа в SQL Server
  • Стандартни низове за формат на дата и час
  • Персонализирани низове за формат на дата и час

Получаване на името на работата

sysjobhistory таблицата не съхранява имена на задачи. Той съхранява само техните идентификационни номера.

За да върнете името на заданието заедно с данните за дата/час/продължителност, можете да извършите присъединяване в sysjobs_view изглед (или sysjobs таблица), за да получите името на заданието.

Ето пример за заявка, която прави това:

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;

Резултат:


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвате функцията IDENTITY() в SQL Server

  2. Какво е новото в SQL Server 2019?

  3. Съкратете всички таблици в база данни в SQL Server - SQL Server / TSQL урок, част 55

  4. Как да инсталирате SQL Server на Linux

  5. Как да получите дата във формат ГГГГ-ММ-ДД от TSQL поле за дата и час?