यदि आपने कभी sysjobhistory
. के बारे में पूछा है msdb
में तालिका डेटाबेस, आपको शायद पता होगा कि डेटाटाइम और अवधि कॉलम पूर्णांक के रूप में संग्रहीत हैं।
विशेष रूप से, जब आप इस तालिका को क्वेरी करते हैं, तो run_date
, run_time
, और duration
कॉलम को पूर्णांक के रूप में लौटाया जाता है, जिससे इसे पढ़ना मुश्किल हो सकता है।
नीचे एक क्वेरी है जिसका उपयोग आप इस डेटा को पढ़ने में आसान प्रारूप में वापस करने के लिए कर सकते हैं।
समस्या
सबसे पहले, आइए देखें कि ये कॉलम कैसे लौटाए जाते हैं:
SELECT TOP 15
run_date,
run_time,
run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
परिणाम:
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
यहां बताया गया है कि प्रत्येक कॉलम कैसे संग्रहीत/प्रस्तुत किया जाता है:
- द
run_date
स्तंभ YYYYMMDD प्रारूप में संग्रहीत है। - द
run_time
कॉलम को 24 घंटे की घड़ी में HHMMSS फॉर्मेट में स्टोर किया जाता है। लेकिन कोई अग्रणी शून्य नहीं है। - द
run_duration
कॉलम एचएचएमएमएसएस प्रारूप में संग्रहीत है। फिर, कोई अग्रणी शून्य नहीं है। साथ ही प्रत्येक खंड के बीच अंतर करने में हमारी सहायता करने के लिए कोई कोलन नहीं हैं। तो ऊपर दिए गए उदाहरण में, पहला काम 6 मिनट 25 सेकंड में, दूसरा काम 1 मिनट 28 सेकंड में और तीसरा काम 17 सेकंड में पूरा हुआ।
एक बार जब आप जान जाते हैं कि स्वरूपण कैसे काम करता है, तो आमतौर पर इसका पता लगाना बहुत मुश्किल नहीं होता है। लेकिन हम मनुष्यों के लिए पढ़ना अनपेक्षित हो सकता है।
समाधान
यहां एक समाधान दिया गया है जो डेटा को अधिक मानव-पठनीय प्रारूप में प्रस्तुत करता है:
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;
परिणाम:
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
यहां, मैं अनिर्दिष्ट AGENT_DATETIME()
. का उपयोग करता हूं run_date
को कन्वर्ट करने के लिए फंक्शन और run_time
अधिक पठनीय प्रारूप में कॉलम।
मैं तब टी-एसक्यूएल कार्यों की एक श्रृंखला का उपयोग करता हूं (STUFF()
, RIGHT()
, CAST()
, और REPLICATE()
) run_duration
. प्राप्त करने के लिए अधिक मानव-पठनीय प्रारूप में कॉलम। ये सुनिश्चित करते हैं कि एक उपयुक्त स्थान पर कोलन डाले गए हैं, और प्रत्येक खंड के लिए हमेशा दो अंक (आवश्यक होने पर एक अग्रणी शून्य सहित) होते हैं।
अधिक स्वरूपण
आप इसे एक कदम आगे ले जा सकते हैं और अन्य कार्यों का उपयोग कर सकते हैं, जैसे कि FORMAT()
run_date
प्रस्तुत करने के लिए कार्य करता है और run_time
एक प्रारूप में कॉलम जो और भी अधिक पाठक-अनुकूल है।
SELECT TOP 15
FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
परिणाम:
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
आप इस फ़ंक्शन के साथ-साथ संस्कृति तर्क के साथ किसी भी अन्य प्रारूप विनिर्देशक का उपयोग कर सकते हैं।
अधिक जानकारी और उदाहरणों के लिए देखें:
- एसक्यूएल सर्वर में दिनांक और समय को कैसे प्रारूपित करें
- मानक दिनांक और समय प्रारूप स्ट्रिंग्स
- कस्टम दिनांक और समय प्रारूप स्ट्रिंग्स
नौकरी का नाम प्राप्त करना
sysjobhistory
तालिका नौकरी के नाम संग्रहीत नहीं करती है। यह केवल उनकी आईडी संग्रहीत करता है।
दिनांक/समय/अवधि डेटा के साथ कार्य का नाम वापस करने के लिए, आप sysjobs_view
पर एक जॉइन कर सकते हैं देखें (या sysjobs
तालिका) नौकरी का नाम पाने के लिए।
यहां एक क्वेरी का उदाहरण दिया गया है जो ऐसा करती है:
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;
परिणाम: