Верхний предел условия Года в моем запросе игнорируется - PullRequest
2 голосов
/ 28 февраля 2020

Это довольно неловкий вопрос, но он потратил 2 часа моего времени, поэтому я сдаюсь.

В приведенном ниже запросе второе условие (которое устанавливает верхний предел моего запроса) игнорируется сервером SQL. Он возвращает ВСЕ годы, превышающие 2018, вместо того, чтобы возвращать строки с 2018 по 2021 (при условии, что сегодняшний год - 2020)

Обратите внимание, что я хотел бы СОХРАНИТЬ годы и контролировать это, используя ГОДЫ, а не указывать дату и время. Что я делаю неправильно? почему мой запрос возвращает все строки больше 2018 (верхний предел игнорируется) ???

                    --THIS QUERY SHOULD RETURN ALL ROWS WITH "STARTDATETIME"
                    -- WITH YEARS GREATER THAN 2018 (SO BASICALLY 2018-01-01) 
                    -- BUT NOT THE ROWS WITH YEARS GREATER THAN ONE YEAR AHEAD OF TODAY'S DATE 
                    -->STARTDATETIME IS DATETIME
                    --I'D LIKE TO MANAGE THIS QUERY BY USING YEARS (BECAUSE IT IS A PARAM IN SSRS)
                    SELECT STARTDATETIME FROM ACTION
                    WHERE  (YEAR(STARTDATETIME)>='2018' --Greater than equal to 2018  
                            AND 
                            (YEAR(STARTDATETIME)<=(DATEADD(year, 1, GETDATE()))) --this condition is mysteriously ignored 
                            -- I kept adding brackets. 
                            ) --but up to only one year ahead
                    ORDER BY STARTDATETIME DESC 

Что я пробовал? Все мыслимые (кроме указания фактического времени и даты). Я продолжал добавлять скобки, чтобы решить проблему, но это не помогло

Ответы [ 3 ]

2 голосов
/ 28 февраля 2020

YEAR() возвращает целое число.

DATEADD() возвращает дату.

Это несопоставимо.

Возможно, вы намереваетесь:

STARTDATETIME <= DATEADD(year, 1, GETDATE())

Если вы хотите до конца следующего года, я бы порекомендовал:

STARTDATETIME < datefromparts(year(getdate()) + 2, 1, 1)

То есть до первого дня 2022 года. Это работает как для дат, так и для даты / раз. И это позволяет использовать индексы, если они доступны.

1 голос
/ 28 февраля 2020

Вы сравниваете int с date-time:

YEAR(STARTDATETIME) = DATEADD(year, 1, GETDATE())

Вам нужно либо позвонить year() с dateadd(), либо удалить year() из STARTDATETIME:

WHERE YEAR(STARTDATETIME) >= 2018 AND
      YEAR(STARTDATETIME) <= YEAR(DATEADD(year, 1, GETDATE()))
0 голосов
/ 28 февраля 2020

При втором условии вы сравниваете год со всей датой:

(YEAR(STARTDATETIME)<=(DATEADD(year, 1, GETDATE()))) 

Почему бы вам не попробовать следующее?

STARTDATETIME<=DATEADD(year, 1, GETDATE())
...