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_time
và duration
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_date
và run_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()
và 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_date
và run_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ả: