Между датами, где пункт со смещающейся датой

Можно ли сделать следующее в SQL. Я хотел бы написать код, который будет возвращать записи между определенными датами, но будет автоматически обновляться при запуске отчета. Так, например:

18 декабря я хотел бы вернуть записи с 1 ноября по 18 ноября и с 1 декабря по 18 декабря, чтобы я мог сравнивать месяц за месяцем по этим записям в своем отчете.

Я понимаю, что могу:

WHERE
[database] BETWEEN '2013-11-01' and DATEADD(Month, 1, getdate ())) 
and not [database] IN ('2013-11-19 and '2013-11-30')

но мне придется каждый день заходить в запрос, чтобы обновить не между ними. Я хотел бы сделать так, чтобы я мог запускать запрос в любой день и получать записи за предыдущий месяц до тех пор, пока дата не совпадет с этим месяцем. В настоящее время я работаю с этим:

B.[datepaid] between DATEADD(Month, -1, getdate() ) 
and  DATEADD(MONTH, 1,  getdate() ))

но он возвращает все записи за ноябрь.


person dgamboa9999    schedule 18.12.2013    source источник
comment
Тот факт, что он возвращает результаты за весь ноябрь, связан с тем, что вы жестко запрограммировали 2013-11-01 в своем предложении where.   -  person aledpardo    schedule 18.12.2013


Ответы (1)


Я бы рекомендовал не использовать BETWEEN с датами, так как это может привести к неожиданным результатам. Но в вашем случае вы можете использовать:

WHERE ([Date] >= DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()) - 1, '19000101')
AND [Date] < DATEADD(MONTH, -1, GETDATE()))
OR ([Date] >= DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101')
AND [Date] < GETDATE());

Демонстрация SQL Fiddle

person GarethD    schedule 18.12.2013