Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Formatuj kolumny daty i czasu trwania sysjobhistory w SQL Server

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:


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Różne sposoby monitorowania zawsze włączonych grup dostępności programu SQL Server

  2. Jak naprawić „Schemat partycji ‚…’ nie ma żadnej następnej używanej grupy plików” w SQL Server

  3. Jak formatować wartości ujemne za pomocą nawiasów w SQL Server (T-SQL)

  4. 9 ważnych zadań, za które odpowiedzialni są administratorzy baz danych

  5. Jak ustawić domyślny język dla wszystkich nowych loginów w SQL Server (T-SQL)