Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Format sysjobhistory datetime &durasi Kolom di SQL Server

Jika Anda pernah menanyakan sysjobhistory tabel di msdb database, Anda mungkin tahu bahwa kolom datetime dan durasi disimpan sebagai bilangan bulat.

Khususnya, saat Anda mengkueri tabel ini, run_date , run_time , dan duration kolom dikembalikan sebagai bilangan bulat, yang dapat membuat sulit untuk dibaca.

Di bawah ini adalah kueri yang dapat Anda gunakan untuk mengembalikan data ini dalam format yang lebih mudah dibaca.

Masalahnya

Pertama, mari kita lihat bagaimana kolom ini dikembalikan:

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

Hasil:

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

Begini cara setiap kolom disimpan/disajikan:

  • run_date kolom disimpan dalam format YYYYMMDD.
  • run_time kolom disimpan dalam format HHMMSS pada jam 24 jam. Tapi tidak ada nol di depan.
  • run_duration kolom disimpan dalam format HHMMSS. Sekali lagi, tidak ada nol di depan. Plus tidak ada titik dua untuk membantu kami membedakan setiap segmen. Jadi pada contoh di atas, pekerjaan pertama selesai dalam 6 menit 25 detik, pekerjaan kedua selesai dalam 1 menit 28 detik, dan pekerjaan ketiga selesai dalam 17 detik.

Setelah Anda mengetahui cara kerja pemformatan, biasanya tidak terlalu sulit untuk mengetahuinya. Tapi bisa jadi tidak intuitif bagi kita manusia untuk membaca.

Solusinya

Berikut adalah solusi yang menyajikan data dalam format yang lebih mudah dibaca manusia:

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;

Hasil:

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

Di sini, saya menggunakan AGENT_DATETIME() . yang tidak berdokumen berfungsi untuk mengonversi run_date dan run_time kolom ke dalam format yang lebih mudah dibaca.

Saya kemudian menggunakan serangkaian fungsi T-SQL (STUFF() , RIGHT() , CAST() , dan REPLICATE() ) untuk mendapatkan run_duration kolom ke dalam format yang lebih dapat dibaca manusia. Ini memastikan bahwa ada titik dua yang disisipkan di tempat yang sesuai, dan selalu ada dua digit (termasuk nol di depan jika diperlukan) untuk setiap segmen.

Pemformatan Lebih Banyak

Anda dapat melangkah lebih jauh dan menggunakan fungsi lain, seperti FORMAT() berfungsi untuk menampilkan run_date dan run_time kolom dalam format yang lebih ramah pembaca.

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

Hasil:

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

Anda dapat menggunakan sejumlah penentu format lain dengan fungsi ini, serta argumen budaya.

Untuk informasi dan contoh lebih lanjut, lihat:

  • Cara Memformat Tanggal &Waktu di SQL Server
  • String Format Tanggal dan Waktu Standar
  • String Format Tanggal dan Waktu Khusus

Mendapatkan Nama Pekerjaan

sysjobhistory tabel tidak menyimpan nama pekerjaan. Itu hanya menyimpan ID mereka.

Untuk mengembalikan nama pekerjaan beserta data tanggal/waktu/durasi, Anda dapat melakukan join di sysjobs_view lihat (atau sysjobs table) untuk mendapatkan nama pekerjaan.

Berikut ini contoh kueri yang melakukan hal itu:

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;

Hasil:


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah kueri ANSI JOIN vs. non-ANSI JOIN akan bekerja secara berbeda?

  2. Menilai Pengaturan Pemantauan Kinerja Basis Data Anda

  3. Dapatkan Hari Tahun Ini dari Tanggal di SQL Server (T-SQL)

  4. Cara Mengganti NULL dengan Nilai Lain di SQL Server – ISNULL()

  5. Hitung baris per jam di SQL Server dengan nilai tanggal-waktu penuh sebagai hasilnya