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

时间:2016-11-02 18:08:16

标签: sql-server tsql

在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到日期的显式转换。

有什么想法吗?

2 个答案:

答案 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

解释

  • 首先从int转换为datetime
  • 从日期时间到日期(删除时间)
  • 与今天的日期(时间已删除)进行比较