Jeśli kiedykolwiek pytałeś o sysjobhistory
tabela w msdb
bazy danych, prawdopodobnie wiesz, że kolumny daty i czasu trwania są przechowywane jako liczby całkowite.
W szczególności, gdy wysyłasz zapytanie do tej tabeli, run_date
, run_time
i duration
kolumny są zwracane jako liczby całkowite, co może utrudniać czytanie.
Poniżej znajduje się zapytanie, którego możesz użyć, aby zwrócić te dane w łatwiejszym do odczytania formacie.
Problem
Najpierw spójrzmy, jak te kolumny są zwracane:
SELECT TOP 15
run_date,
run_time,
run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Wynik:
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
Oto jak każda kolumna jest przechowywana/prezentowana:
run_date
kolumna jest przechowywana w formacie RRRRMMDD.run_time
kolumna jest przechowywana w formacie HHMMSS na zegarze 24-godzinnym. Ale nie ma wiodących zer.run_time
kolumna jest przechowywana w formacie HHMMSS. Znowu nie ma wiodących zer. Dodatkowo nie ma dwukropków, które pomogą nam odróżnić każdy segment. W powyższym przykładzie pierwsze zadanie zakończyło się w 6 minut i 25 sekund, drugie w 1 minutę i 28 sekund, a trzecie w 17 sekund.
Gdy już wiesz, jak działa formatowanie, zwykle nie jest trudno to rozgryźć. Ale dla nas, ludzi, czytanie może być nieintuicyjne.
Rozwiązanie
Oto rozwiązanie, które prezentuje dane w formacie bardziej czytelnym dla człowieka:
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;
Wynik:
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
Tutaj używam nieudokumentowanego AGENT_DATETIME()
funkcja do konwersji run_date
i run_time
kolumny w bardziej czytelnym formacie.
Następnie używam serii funkcji T-SQL (STUFF()
, RIGHT()
, CAST()
i REPLICATE()
), aby uzyskać run_duration
w bardziej czytelnym dla człowieka formacie. Zapewniają one, że w odpowiednim miejscu są wstawione dwukropki i że każdy segment ma zawsze dwie cyfry (włącznie z wiodącym zerem, jeśli to konieczne).
Więcej formatowania
Możesz pójść o krok dalej i użyć innych funkcji, takich jak FORMAT()
funkcja prezentująca run_date
i run_time
kolumny w formacie, który jest jeszcze bardziej przyjazny dla czytelnika.
SELECT TOP 15
FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Wynik:
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
Za pomocą tej funkcji można użyć dowolnej liczby innych specyfikatorów formatu, a także argumentu kultury.
Aby uzyskać więcej informacji i przykładów, zobacz:
- Jak sformatować datę i godzinę w SQL Server
- Ciągi standardowego formatu daty i godziny
- Niestandardowe ciągi formatu daty i godziny
Pobieranie nazwy stanowiska
sysjobhistory
tabela nie przechowuje nazw zadań. Przechowuje tylko ich identyfikatory.
Aby zwrócić nazwę zadania wraz z datą/godziną/czasem trwania, możesz wykonać dołączenie w sysjobs_view
widok (lub sysjobs
tabeli), aby uzyskać nazwę pracy.
Oto przykład zapytania, które to robi:
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;
Wynik: