2016-11-02 2 views
1

Работа с sysjobs и sysjobhistory на SQL Server, и я искал его, но я не могу найти прямой ответ на этот вопрос. Я думаю, что это потому, что я пытаюсь сделать это в предложении WHERE.Преобразование INT в DATE в выражении WHERE - TSQL

Так что в основном попытка выбрать задание, которое потерпело неудачу, в тот же день, в котором он работал (в основном сегодняшняя дата), так как текущий код выбирает все существующие задания, которые не удались.

Ниже мой код:

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, состояние 2, строка 13
Явного преобразования типа данных междунара на сегодняшний день не допускается.

Любые идеи?

+0

В чем смысл этих подзапросов? –

+0

Я предполагаю, что это не должно быть в подзапросе? – AznDevil92

+0

Это не корень проблемы, но они не должны быть подзапросами. –

ответ

4

Вы не должны делать все эти преобразования, просто преобразовать параметр (т.е. текущая дата) в цельном формат даты с 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). Преобразование из строки в целое неявно

+0

Plus1 Лучше всего 1 конверсия –

+1

Множественные конверсии - это то, что вызвало сбой этого запроса –

+0

Итак, есть ли разница между вашим ответом и ответом jhilden? Оба вернулись с такими же результатами. Я предполагаю, что оба имеют ту же логику. – AznDevil92

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
  • низвержен с DateTime на сегодняшний день (падение времени)
  • сравниваться с сегодняшнего дня (со временем упала)
+0

. Нет причин для выполнения всех этих преобразований. –

+0

Я согласен, другой ответ лучше. – jhilden

Смежные вопросы