我的查询中 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
我尝试了什么?一切可以想象的(除了给出实际的日期时间)。我一直在添加括号来解决问题,但没有帮助
您正在比较 int
和 date-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())
这是一个很尴尬的问题,但它浪费了我 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
我尝试了什么?一切可以想象的(除了给出实际的日期时间)。我一直在添加括号来解决问题,但没有帮助
您正在比较 int
和 date-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())