在SQL Server上使用sysjobs和sysjobhistory,我一直在谷歌搜索,但我似乎无法找到这个问题的直接答案。我认为这是因为我试图在WHERE子句中这样做。
因此,基本上尝试选择在其运行的同一天失败的作业(基本上是今天的日期),因为当前代码正在选择所有失败的现有作业。
以下是我的代码:
SELECT DISTINCT
sj.name,
COUNT(sjh.instance_id) AS errors
FROM
msdb..sysjobhistory sjh
JOIN
msdb.dbo.sysjobs sj ON sj.job_id = sjh.job_id
WHERE
name IN ('SQLAgentJob1', 'SQLAgentJob2')
AND sjh.run_status = 1
AND (SELECT CONVERT(DATE, CONVERT(INT, sjh.run_date), 112)) = (SELECT CONVERT(DATE, GETDATE(), 112))
GROUP BY
sj.name
我一直收到错误声明:
Msg 529,Level 16,State 2,Line 13
不允许从数据类型int到日期的显式转换。
有什么想法吗?
答案 0 :(得分:5)
您不必进行所有这些转换,只需将参数(即当前日期)转换为未分隔的日期格式,然后使用112:
SELECT DISTINCT sj.name, COUNT(sjh.instance_id) AS errors
FROM msdb..sysjobhistory sjh
JOIN msdb.dbo.sysjobs sj ON sj.job_id = sjh.job_id
WHERE name IN ('SQLAgentJob1','SQLAgentJob2')
AND sjh.run_status = 1
AND sjh.run_date= CONVERT(nvarchar(8), GETDATE(), 112)
GROUP BY sj.name
没有整数到日期转换,因为日期没有整数表示。
run_date
列将YYYYMMDD
格式存储为整数,可能是为了减少空间消耗(4个字节而不是8个),可能是出于其他原因。
要与之进行比较,只需使用CONVERT(nvarchar(8), GETDATE(), 112)
创建等效字符串即可。从字符串到整数的转换是隐式的
答案 1 :(得分:1)
这应该有用。
SELECT DISTINCT sj.name,
COUNT(sjh.instance_id) AS errors
FROM msdb..sysjobhistory sjh
JOIN msdb.dbo.sysjobs sj ON sj.job_id = sjh.job_id
WHERE name IN ('SQLAgentJob1',
'SQLAgentJob2')
AND sjh.run_status = 1
AND CAST(CONVERT(datetime, CAST(SJH.[run_date] AS CHAR(8))) as DATE) = CAST(GETDATE() as DATE)
GROUP BY sj.name