Не удается преобразовать Datetime в Int

#sql #stored-procedures #sql-server-2012

#sql #хранимые процедуры #sql-server-2012

Вопрос:

Я пытаюсь SELECT создать строки на основе двух значений с помощью этой хранимой процедуры:

 ALTER PROCEDURE [dbo].[MYSelect]

    -- Parameters with default values
    @MitarbeiterId          AS int,
    @Wann                   AS datetime2(7)

AS

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
        SET NOCOUNT ON;

        SELECT  *
        FROM    [Plan] 
        WHERE   RefMitarbeiterId    =   @MitarbeiterId
        AND     Jahr                <=  YEAR(@Wann)
        AND     Monat               <=  MONTH(@Wann)
        AND     Abgeschlossen       =   0
  

Проблема заключается в следующей части:

         AND     Jahr                <=  YEAR(@Wann)
        AND     Monat               <=  MONTH(@Wann)
  

Я не знаю, почему эта часть вызывает (синтаксическую) проблему. С учетом этих строк, используя MSSQL Studio, я получаю сообщение об ошибке unable to convert DateTime to Integer . Удаление этих результатов возвращает результаты и не имеет синтаксической ошибки. Я использую YEAR() и MONTH() в других местах, поэтому я не понимаю, почему здесь возникает проблема.

Это Plan таблица:

Таблица планирования

Комментарии:

1. И в чем проблема?

Ответ №1:

Условия

 AND  Jahr <=  YEAR(@Wann)
AND  Monat <= MONTH(@Wann)
  

разделите условие на год и месяц.

Это не означает, что годы и месяц меньше параметра, но где год меньше или равен году параметра, а месяц меньше или равен месяцу параметра.

Используя today (2014-06-30) в качестве параметра, ваш запрос вернет каждую строку, где с Monat от 1 до 6 для прошлого и текущего года: например, строки с декабря 2013 года не будут возвращены.

Чтобы получить все строки до даты параметра, вам нужно изменить условия на

 AND  ((Jahr = YEAR(@Wann) AND  Monat <= MONTH(@Wann))
   OR  Jahr < YEAR(@Wann))
  

Комментарии:

1. mhh, я также выполняю процедуру по-разному с всегда одинаковыми параметрами. Это похоже на ошибку, если вы используете представление для запуска процедуры, которая выдает эту ошибку, но если вы запустите ее через EXEC , она работает нормально

Ответ №2:

После тестирования различных способов выполнения этой процедуры
я теперь думаю, что это ошибка, если вы используете представление с параметром Datetime в SQL Server Manangement Studio

потому что я тестировал

EXEC

введите описание изображения здесь

который работает хорошо

затем удалил мои параметры

введите описание изображения здесь

это возвращает ошибку, которая сообщает мне, что не удалось преобразовать '01.07.2014 00:00:00' в datetime, но возвращает правильные строки

если я сейчас сделаю это снова со своими параметрами и добавлю свои значения

введите описание изображения здесь

я получаю исключение, которое сообщает мне то же самое, что и ошибка выше, поэтому мне нужно удалить ' , а затем я получаю unable to convert DateTime to Integer сообщение, которое, по моему мнению, является ошибкой