Как настроить таргетинг на последний месяц в SQL-запросе

Я использую этот код в запросе SQL

WHERE [Date] >= DATEFROMPARTS(DATEPART(year,GETDATE()),DATEPART(month,GETDATE())-1,DATEPART(day,GETDATE()))
  AND [Date] <= EOMONTH(DATEFROMPARTS(DATEPART(year,GETDATE()),DATEPART(month,GETDATE())-1,DATEPART(day,GETDATE())));

Проблема в том, что в 2020 году декабрьский запрос выдаст ошибку

Код, который я разместил, управляет датами, между которыми будут возвращены данные. Он смотрит на дату запуска кода и выбирает этот день с прошлого месяца до конца прошлого месяца. Мне нужны даты с 1-го по последний день месяца, предшествующего тому, в котором вызывается этот код.

Я буду работать над этой проблемой завтра, будет интересно посмотреть, какие решения могут предложить другие люди.


person Ronan    schedule 29.10.2019    source источник
comment
Проблема в том, что в 2020 году декабрьский запрос выдаст ошибку. Я не вижу никаких ошибок. db‹›скрипка   -  person Larnu    schedule 29.10.2019
comment
вы пытаетесь использовать «2020-12-31»?   -  person LONG    schedule 29.10.2019
comment
Если вы не можете определить в тексте, чего вы пытаетесь достичь, вам будет сложно написать соответствующий код. И вы, вероятно, не совсем понимаете свою цель. Если сегодня 30 марта 2019 года, какие даты вы собираетесь использовать в качестве границ в своих запросах? Если ваша цель — использовать тот же день предыдущего месяца, вам нужно будет явно определить, что делать с этими проблемами на конец месяца.   -  person SMor    schedule 30.10.2019
comment
Не обязательно правильно. Или, будучи дислектиком, мне гораздо труднее определить свои проблемы с кодированием на английском языке, а не на коде. Ребята ниже указали мне, что DATEADD — это то, что мне нужно для этого действия. Это позволит мне вычесть месяц из января и, надеюсь, получить декабрь.   -  person Ronan    schedule 30.10.2019


Ответы (2)


Если вы хотите предыдущий месяц:

where date >= dateadd(month, -1, datefromparts(year(getdate(), month(getdate(), 1))) and
      date < datefromparts(year(getdate(), month(getdate(), 1))

Это просто проверяет, что это до первого числа этого месяца, а затем вычитает месяц из этого.

person Gordon Linoff    schedule 29.10.2019
comment
Гордон, это хорошее решение, я бы определил конец месяца так же, как я определил начало месяца, однако вы использовали сравнение для достижения той же цели. - person Ronan; 30.10.2019

попробуй это

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0),
    DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) - 1 

это даст вам дату начала и окончания предыдущего месяца

person JamieD77    schedule 29.10.2019
comment
Короче, чем моя версия... интересная техника использования 0 в качестве начальной даты по сравнению с фактической датой. В противном случае неочевидно на основе ожидаемых типизированных параметров... Нравится... - person DRapp; 29.10.2019