У меня проблема в запросе, когда SQL Server выдает ошибку
Невозможно создать дату типа данных, некоторые аргументы имеют значения, которые недопустимы
при сравнении двух объектов даты, которые сами по себе являются действительными.
Если я удаляю предложение where, оно разрешается без ошибок, но в тот момент, когда я пытаюсь сравнить их с любым реляционным оператором или оператором равенства, снова возникают ошибки.
Минимальный запрос для воспроизведения проблемы равенследует:
with Years as
(
select
YEAR(getdate()) + 1 Year,
DATEFROMPARTS(YEAR(getdate()) + 1, 1, 1) FirstOfTheYear,
0 YearOffset
union all
select
Year - 1,
DATEFROMPARTS(Year - 1, 1, 1),
YearOffset + 1
from Years
where YearOffset < 5
),
Months as
(
select 1 Month
union all
select Month + 1
from Months
where Month < 12
),
Days as
(
select 1 Day
union all
select Day + 1
from Days
where Day < 31
),
Dates as
(
select cast(DATEFROMPARTS(Year, Month, Day) as date) Date
from Years
cross join Months
cross join Days
where DAY(EOMONTH(FirstOfTheYear, Month - 1)) >= Day
)
select Dates.Date, cast ('2019-10-01' as date), CAST ('2019-10-11' as date)
from Dates
where Date = cast ('2019-10-01' as date) -- Comment this line out and the error goes away, occurs with any date construction pattern
--where Dates.[Date] >= datefromparts(2019, 10, 01) and Dates.[Date] <= DATEFROMPARTS(2019, 10, 11)
order by date
Комментирование предложения where возвращает результаты, как и ожидалось, подтверждая, что именно сравнение вызывает эту проблему.
Кроме того, вручную создается несколько дат (сначала2015-2019 гг., октябрьские даты в запросе) и запрос этого не приводит к отображению ошибки.
Редактировать: хочу подчеркнуть, что код уже обрабатывает февраль иправильно високосные годыВывод даты CTE действителен и выводит полный диапазон без ошибок. только , когда я ссылаюсь на дату в предложении where, она выдает ошибку
Edit2: я смог решить свою проблему, переключившись на другой шаблон генерации даты (добавление день за днем, в рекурсивном), но мне все еще любопытно, что вызывает эту ошибку.