Выберите между определенным днем ​​​​текущего месяца и предыдущего месяца

Я искал это, но получил ответы только на указанные даты.

Проблема, с которой я столкнулся, заключается в следующем:

Возвращает все данные между 20-м числом предыдущего месяца и 20-м числом текущего месяца.

select name, data, activity from Table
where (year(data) = year(getdate()) and month(data) = month(getdate())-1 and day(data) >= 20) and (year(data) = year(getdate()) and month(data) = month(getdate()) and day(data) <= 20)

select name, data, activity from Table
where year(data) = year(getdate()) and month(data) >= month(getdate())-1 and day(data) >= 20

Этот последний будет работать, но он не вернет никакого результата за текущий месяц.

Я пробовал несколько предложений where, но похоже, что сработает только указание дат. Есть ли способ сделать это динамически?

Спасибо


person valter.vx    schedule 17.04.2017    source источник


Ответы (2)


Вы можете использовать eomonth() для сравнения месяцев:

select t.*
from t
where ( day(data) >= 20 and eomonth(data) = eomonth(dateadd(month, -1, getdate())) ) or
      ( day(data) < 20 and eomonth(data) = emonth(getdate()) );

Вы можете сделать это в SQL Server 2008, но арифметика дат немного неприятнее. Один из способов — вычесть 21 день и проверить, является ли это предыдущим месяцем:

select t.*
from t
where (year(dateadd(day, -21, data)) * 12 + month(dateadd(day, -21, data)) =
       year(getdate()) * 12 + month(getdate()) - 1
      )
person Gordon Linoff    schedule 17.04.2017
comment
Спасибо @Gordon, но похоже, что компания использует SQL Server 2008, а eomonth наступает только в 2012 году. Есть ли способ смоделировать eomonth в 2008 году? Спасибо - person valter.vx; 17.04.2017

Поскольку ofmonth не существует в 2008 году, я перевел правильный ответ @Gordon следующим образом:

( day(data) >= 20 and CONVERT(DATE, dateadd(mm, datediff(mm,0, data)+1,-1)) = CONVERT(DATE, dateadd(mm, datediff(mm,0, dateadd(month, -1, getdate()))+1,-1)) ) or
  ( day(data) < 20 and CONVERT(DATE, dateadd(mm, datediff(mm,0, data)+1,-1)) = CONVERT(DATE, dateadd(mm, datediff(mm,0, current_timestamp)+1,-1)) )

и это сработало.

Спасибо

person valter.vx    schedule 17.04.2017