我一直在搜索这个,但只得到指定日期的答案。
我面临的问题是:
返回上个月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子句,但它只会指定日期才有用。有没有办法动态地做到这一点?
由于
答案 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)) )
并且有效。
由于