在当月的特定日期和上个月之间进行选择

时间:2017-04-17 14:08:16

标签: sql sql-server between

我一直在搜索这个,但只得到指定日期的答案。

我面临的问题是:

返回上个月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子句,但它只会指定日期才有用。有没有办法动态地做到这一点?

由于

2 个答案:

答案 0 :(得分:0)

您可以使用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
      )

答案 1 :(得分:0)

截至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)) )

并且有效。

由于