Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Định dạng cột ngày giờ &thời lượng sysjobhistory trong SQL Server

Nếu bạn đã từng truy vấn sysjobhistory trong msdb cơ sở dữ liệu, bạn có thể sẽ biết rằng các cột ngày giờ và thời lượng được lưu trữ dưới dạng số nguyên.

Đặc biệt, khi bạn truy vấn bảng này, run_date , run_timeduration các cột được trả về dưới dạng số nguyên, điều này có thể gây khó đọc.

Dưới đây là truy vấn bạn có thể sử dụng để trả về dữ liệu này ở định dạng dễ đọc hơn.

Vấn đề

Trước tiên, hãy xem cách các cột này được trả về:

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

Kết quả:

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

Dưới đây là cách mỗi cột được lưu trữ / trình bày:

  • run_date cột được lưu trữ ở định dạng YYYYMMDD.
  • run_time cột được lưu trữ ở định dạng HHMMSS trên đồng hồ 24 giờ. Nhưng không có số 0 ở đầu.
  • run_duration cột được lưu trữ ở định dạng HHMMSS. Một lần nữa, không có số 0 ở đầu. Thêm vào đó, không có dấu hai chấm để giúp chúng ta phân biệt giữa từng phân đoạn. Vì vậy, trong ví dụ trên, công việc đầu tiên hoàn thành trong 6 phút 25 giây, công việc thứ hai hoàn thành trong 1 phút 28 giây và công việc thứ ba hoàn thành sau 17 giây.

Khi bạn biết cách thức hoạt động của định dạng, thường không quá khó để tìm ra nó. Nhưng nó có thể không trực quan đối với con người chúng ta để đọc.

Giải pháp

Dưới đây là giải pháp trình bày dữ liệu ở định dạng dễ đọc hơn cho con người:

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;

Kết quả:

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

Ở đây, tôi sử dụng AGENT_DATETIME() không có giấy tờ hàm chuyển đổi run_daterun_time sang định dạng dễ đọc hơn.

Sau đó, tôi sử dụng một loạt các hàm T-SQL (STUFF() , RIGHT() , CAST()REPLICATE() ) để lấy run_duration sang một định dạng dễ đọc hơn. Những điều này đảm bảo rằng có dấu hai chấm được chèn ở một vị trí thích hợp và luôn có hai chữ số (bao gồm cả số 0 ở đầu nếu cần) cho mỗi đoạn.

Định dạng khác

Bạn có thể tiến thêm một bước nữa và sử dụng các hàm khác, chẳng hạn như FORMAT() hàm để trình bày run_daterun_time ở định dạng thân thiện hơn với người đọc.

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

Kết quả:

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

Bạn có thể sử dụng bất kỳ số lượng định dạng nào khác với chức năng này, cũng như đối số văn hóa.

Để biết thêm thông tin và ví dụ, hãy xem:

  • Cách Định dạng Ngày và Giờ trong SQL Server
  • Chuỗi định dạng ngày và giờ chuẩn
  • Chuỗi định dạng ngày và giờ tùy chỉnh

Lấy tên công việc

sysjobhistory bảng không lưu trữ tên công việc. Nó chỉ lưu trữ ID của họ.

Để trả về tên công việc cùng với dữ liệu ngày / giờ / thời lượng, bạn có thể thực hiện kết hợp trên sysjobs_view xem (hoặc sysjobs table) để lấy tên công việc.

Dưới đây là một ví dụ về truy vấn thực hiện điều đó:

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;

Kết quả:


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách xóa cột trong SQL Server bằng T-SQL

  2. Khôi phục quyền truy cập vào phiên bản SQL Server mà không cần khởi động lại

  3. Có thể đặt thời gian chờ cho truy vấn SQL trên Microsoft SQL Server không?

  4. Làm cách nào để nhóm trên các phạm vi liên tục

  5. Chèn dữ liệu trong SQL Server 2017