我的查询中 Year 条件的上限被忽略

Upper limit of the Year condition in my query is ignored

这是一个很尴尬的问题,但它浪费了我 2 个小时的时间,所以我放弃了。

在下面的查询中,第二个条件(设置我的查询的上限)被 SQL 服务器忽略。它 returns 所有大于 2018 年的年份,而不是返回从 2018 年到 2021 年的行(假设今天是 2020 年)。

请注意,我想保留年份,并使用 YEARS 控制它,而不提供日期时间。我究竟做错了什么?为什么我的查询返回所有大于 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 

我尝试了什么?一切可以想象的(除了给出实际的日期时间)。我一直在添加括号来解决问题,但没有帮助

您正在比较 intdate-time :

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

您需要使用 dateadd() 调用 year() 或从 STARTDATETIME 中删除 year() :

WHERE YEAR(STARTDATETIME) >= 2018 AND
      YEAR(STARTDATETIME) <= YEAR(DATEADD(year, 1, GETDATE()))

YEAR() returns 一个整数。

DATEADD()returns一个日期。

这些没有可比性。

也许你打算:

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

如果你想在 下一年 年底结束,我建议:

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

也就是说,在 2022 年的第一天之前。这适用于日期和 date/times。并且,它允许使用索引(如果可用)。

在第二个条件下,您将一年与整个日期进行比较:

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

为什么不试试下面的方法呢?

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