Ако някога сте питали 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;
Резултат: