在WHERE子句中将INT转换为DATE - TSQL

Azn*_*l92 2 t-sql sql-server

在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
Run Code Online (Sandbox Code Playgroud)

我一直收到错误声明:

消息529,级别16,状态2,行13
不允许从数据类型int到日期的显式转换.

有任何想法吗?

Pan*_*vos 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 Code Online (Sandbox Code Playgroud)

没有整数到日期转换,因为日期没有整数表示.

run_date列将YYYYMMDD格式存储为整数,可能是为了减少空间消耗(4个字节而不是8个),可能还有其他原因.

要与之进行比较,只需使用创建等效字符串即可CONVERT(nvarchar(8), GETDATE(), 112).从字符串到整数的转换是隐式的