SQL Server Agent, veritabanı yöneticileri için zamanlanmış job’ları otomatik olarak yürütmenin güçlü bir yoludur. Ancak zamanla sistemde çok sayıda job birikir ve özellikle bakım, log veya izleme amaçlı görevlerin geçmişini analiz etmek karmaşık hale gelebilir. Bu nedenle, job geçmişinin başlangıç ve bitiş zamanlarını anlamlı şekilde raporlamak; ayrıca gereksiz veya tekrar eden log job’larını analiz dışı bırakmak büyük önem taşır.
Bu yazıda, SQL Server Agent job’larının çalışma zamanlarını detaylı olarak raporlayan ve belirli job isimlerini dışarıda bırakmanıza imkân tanıyan esnek bir sorgu sunulmaktadır. Script, job’ların başlama-bitiş zamanlarını, çalışma süresini ve çalıştırma sonuçlarını anlaşılır bir formatta listelemekte ve zaman aralığına göre filtreleme imkanı sağlamaktadır.
-- PARAMETRELER: Bu tarihleri isteğine göre değiştir
DECLARE @StartDate DATETIME = '2025-04-13 00:00:00';
DECLARE @EndDate DATETIME = '2025-04-21 23:59:59';
SELECT
j.name AS job_name,
run_datetime AS start_time,
end_datetime AS end_time,
DATEDIFF(SECOND, run_datetime, end_datetime) AS duration_seconds,
CONVERT(VARCHAR(8), DATEADD(SECOND, DATEDIFF(SECOND, run_datetime, end_datetime), 0), 108) AS duration_hhmmss,
CASE h.run_status
WHEN 0 THEN 'Failed'
WHEN 1 THEN 'Succeeded'
WHEN 2 THEN 'Retry'
WHEN 3 THEN 'Canceled'
WHEN 4 THEN 'In Progress'
ELSE 'Unknown'
END AS execution_status
FROM (
SELECT
h.job_id,
-- run_date + run_time birleştirilerek gerçek datetime oluşturuluyor
run_datetime = CONVERT(DATETIME,
STUFF(STUFF(CAST(h.run_date AS CHAR(8)), 5, 0, '-'), 8, 0, '-') + ' ' +
STUFF(STUFF(RIGHT('000000' + CAST(h.run_time AS VARCHAR(6)), 6), 3, 0, ':'), 6, 0, ':')
),
end_datetime = DATEADD(SECOND,
(h.run_duration / 10000) * 3600 + ((h.run_duration % 10000) / 100) * 60 + (h.run_duration % 100),
CONVERT(DATETIME,
STUFF(STUFF(CAST(h.run_date AS CHAR(8)), 5, 0, '-'), 8, 0, '-') + ' ' +
STUFF(STUFF(RIGHT('000000' + CAST(h.run_time AS VARCHAR(6)), 6), 3, 0, ':'), 6, 0, ':')
)
),
h.run_status
FROM msdb.dbo.sysjobhistory h
WHERE h.step_id = 0 -- sadece job başlığı
) h
INNER JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
WHERE h.run_datetime BETWEEN @StartDate AND @EndDate
AND j.name LIKE '%IndexOptimize%'
ORDER BY h.run_datetime DESC;
j.name ifadesinden sonra IN-NOT LIKE-NOT IN ifadeleri girilerek filtreleme yapılabilir.

SQL Server ortamlarında job geçmişinin etkin bir şekilde izlenmesi, sistem sağlığı ve performans analizleri açısından kritik öneme sahiptir. Bu makalede, job başlangıç ve bitiş zamanlarını detaylı şekilde raporlayan, çalışma sürelerini hesaplayan ve belirli job’ları (özellikle log veya bakım job’larını) dışarıda bırakma esnekliği sunan bir SQL sorgusu paylaşıldı.
Bu yaklaşım sayesinde yöneticiler, sadece anlamlı job verilerini inceleyerek daha hızlı analizler yapabilir, anormal çalışma sürelerini tespit edebilir ve gereksiz karmaşayı ortadan kaldırabilir.
Başka bir makelede görüşmek üzere..
“Allah, rüzgarları gönderendir. Onlar da bulutları hareket ettirir. Biz de bulutları ölü bir toprağa sürer ve onunla ölümünden sonra yer yüzünü diriltiriz. İşte ölümden sonra diriliş de böyledir. “Fâtır-9