У меня есть таблица, в которой есть столбец «Дата начала», например:
Start Date
2015/01/05
2015/02/08
2016/01/10
2017/02/10
etc...
Я пытаюсь включить в свой пункт WHERE выбор всех записей, где он за год до этого, на основе текущего GETDATE().
Например, если сегодня июль 2019 года, и я запускаю запрос, я бы хотел, чтобы он выполнялся и давал мне даты начала, начиная с июля 2018 года по июнь 2019 года. И если я запускаю его для августа 2019 года, я хотел бы, чтобы он показывал даты начала с августа 2018 года по июль 2019 года и так далее. В основном до месяца, предшествующего текущей дате.
В настоящее время у меня есть это в моем предложении WHERE:
WHERE start_date between DATEADD(YEAR,-1, GETDATE()) and GETDATE()
но, похоже, я считаю, что это всего за год до текущей даты.
Есть ли лучший способ сделать это?
Если я пытаюсь получить его туда, где он встанет до месяца, предшествующего GETDATE(), нужно ли мне настроить второй GETDATE() на DATEADD(MONTH, -1, GETDATE())?
То, что вы делаете, в порядке. Другое дело, если вы хотите охватить период с 1 июля 2018 года по 1 июля 2019 года. Если это не так, ваш запрос правильный.
Это вопрос объединения правильных функций. Как в этих примерах: zarez.net/?p=2462


Вы можете использовать datefromparts() в SQL Server:
where start_date >= datefromparts(year(getdate()) - 1, 1, 1) and
start_date < datefromparts(year(getdate() - 1, month(getdate()), day(getdate())
Я думаю, что это ваше требование:
WHERE start_date BETWEEN
DATEFROMPARTS(YEAR(GETDATE()) - 1, MONTH(GETDATE()), 1)
AND
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), -1)
С участием:
DATEFROMPARTS(YEAR(GETDATE()) - 1, MONTH(GETDATE()), 1)
вы получаете 1-й день текущего месяца в прошлом году.
С участием:
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), -1)
вы получаете последний день предыдущего месяца.
См. демо.
То, что вы делаете, в порядке. Дважды проверьте свой вывод.