Hvis du nogensinde har forespurgt sysjobhistory
tabel i msdb
database, vil du sikkert vide, at dato- og varighedskolonnerne er gemt som heltal.
Især når du forespørger i denne tabel, er run_date
, run_time
og duration
kolonner returneres som heltal, hvilket kan gøre det svært at læse.
Nedenfor er en forespørgsel, du kan bruge til at returnere disse data i et lettere læseligt format.
Problemet
Lad os først se på, hvordan disse kolonner returneres:
SELECT TOP 15
run_date,
run_time,
run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Resultat:
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
Sådan opbevares/præsenteres hver kolonne:
run_date
kolonne er gemt i formatet ÅÅÅÅMMDD.run_time
kolonne er gemt i HHMMSS-format på et 24-timers ur. Men der er ingen foranstillede nuller.run_duration
kolonne er gemt i HHMMSS-format. Igen er der ingen foranstillede nuller. Derudover er der ingen koloner til at hjælpe os med at skelne mellem hvert segment. Så i ovenstående eksempel blev det første job afsluttet på 6 minutter og 25 sekunder, det andet job afsluttet på 1 minut og 28 sekunder, og det tredje job blev afsluttet på 17 sekunder.
Når du først ved, hvordan formateringen fungerer, er det normalt ikke så svært at finde ud af det. Men det kan være uintuitivt for os mennesker at læse.
Løsningen
Her er en løsning, der præsenterer dataene i et mere menneskeligt læsbart format:
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;
Resultat:
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
Her bruger jeg den udokumenterede AGENT_DATETIME()
funktion til at konvertere run_date
og run_time
kolonner til et mere læsbart format.
Jeg bruger derefter en række T-SQL-funktioner (STUFF()
, RIGHT()
, CAST()
, og REPLICATE()
) for at få run_duration
kolonne til et mere menneskeligt læsbart format. Disse sikrer, at der er indsat koloner på et passende sted, og at der altid er to cifre (inklusive et indledende nul, hvis det er nødvendigt) for hvert segment.
Mere formatering
Du kan tage det et skridt videre og bruge andre funktioner, såsom FORMAT()
funktion til at præsentere run_date
og run_time
kolonner i et format, der er endnu mere læservenligt.
SELECT TOP 15
FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Resultat:
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
Du kan bruge et hvilket som helst antal andre formatspecifikationer med denne funktion, såvel som et kulturargument.
For mere information og eksempler, se:
- Sådan formateres dato og klokkeslæt i SQL Server
- Standard dato- og tidsformatstrenge
- Tilpassede dato- og tidsformatstrenge
Få jobnavnet
sysjobhistory
tabel gemmer ikke jobnavne. Den gemmer kun deres ID'er.
For at returnere jobnavnet sammen med dato/klokkeslæt/varighedsdata kan du udføre en joinforbindelse på sysjobs_view
view (eller sysjobs
tabel) for at få jobnavnet.
Her er et eksempel på en forespørgsel, der gør det:
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;
Resultat:
![](http://www.sqldat.com/article/uploadfiles/202205/2022051209201170.png)