sql >> Databáze >  >> RDS >> Sqlserver

Formát sysjobhistory datum, čas a trvání sloupce na SQL Server

Pokud jste se někdy dotazovali na sysjobhistory tabulky v msdb databáze, pravděpodobně budete vědět, že sloupce datum, čas a trvání jsou uloženy jako celá čísla.

Konkrétně, když zadáte dotaz na tuto tabulku, run_date , run_time a duration sloupce jsou vráceny jako celá čísla, což může znesnadnit čtení.

Níže je uveden dotaz, pomocí kterého můžete vrátit tato data ve snáze čitelném formátu.

Problém

Nejprve se podívejme, jak jsou tyto sloupce vráceny:

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

Výsledek:

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

Zde je návod, jak je každý sloupec uložen/prezentován:

  • run_date sloupec je uložen ve formátu RRRRMMDD.
  • run_time sloupec je uložen ve formátu HHMMSS ve 24hodinovém formátu. Nejsou zde ale žádné úvodní nuly.
  • run_duration sloupec je uložen ve formátu HHMMSS. Opět zde nejsou žádné úvodní nuly. Navíc zde nejsou žádné dvojtečky, které by nám pomohly rozlišit jednotlivé segmenty. Ve výše uvedeném příkladu tedy první úloha skončila za 6 minut a 25 sekund, druhá úloha skončila za 1 minutu a 28 sekund a třetí úloha skončila za 17 sekund.

Jakmile víte, jak formátování funguje, obvykle není příliš těžké na to přijít. Ale pro nás lidi může být neintuitivní číst.

Řešení

Zde je řešení, které prezentuje data ve formátu lépe čitelném pro člověka:

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;

Výsledek:

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

Zde používám nezdokumentovaný AGENT_DATETIME() funkce pro převod run_date a run_time sloupce do čitelnějšího formátu.

Poté používám řadu funkcí T-SQL (STUFF() , RIGHT() , CAST() a REPLICATE() ), abyste získali run_duration sloupec do lidsky čitelnějšího formátu. Ty zajišťují, že jsou dvojtečky vloženy na vhodné místo a že pro každý segment jsou vždy dvě číslice (včetně úvodní nuly, pokud je to potřeba).

Další formátování

Můžete to udělat o krok dále a použít další funkce, jako je FORMAT() funkci pro zobrazení run_date a run_time sloupce ve formátu, který je pro čtenáře ještě přívětivější.

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

Výsledek:

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

S touto funkcí můžete použít libovolný počet dalších specifikátorů formátu a také argument kultury.

Další informace a příklady naleznete na adrese:

  • Jak formátovat datum a čas na serveru SQL Server
  • Standardní řetězce formátu data a času
  • Vlastní řetězce formátu data a času

Získání názvu úlohy

sysjobhistory tabulka neukládá názvy úloh. Ukládá pouze jejich ID.

Chcete-li vrátit název úlohy spolu s daty data/času/doby trvání, můžete provést spojení v sysjobs_view zobrazení (nebo sysjobs tabulka), abyste získali název úlohy.

Zde je příklad dotazu, který to dělá:

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;

Výsledek:


  1. Co je @@MAX_PRECISION na serveru SQL Server?

  2. Vkládání do Oracle Nested Table v Javě

  3. SQL Server - Auto-inkrementace, která umožňuje příkazy UPDATE

  4. 10 otázek k rozhovoru s databází MySQL pro začátečníky a mírně pokročilé