我希望找到一个解决方案来自动化我的报告。基本上我在这里要完成的是抓住一个日期(上个月的第一天,两年前到当月的前一个月的最后一天)。
因此,如果本月运行的日期跨度如下所示:2013年4月1日至2015年3月31日之间
我找到了两年前获得日期的代码,但我无法合并月份功能......非常感谢任何帮助!
我正在使用这一年:
SELECT CONVERT(VARCHAR(25),DATEADD(year,-2,GETDATE()),101)
答案 0 :(得分:1)
您的where
子句看起来像这样:
where date >= cast(dateadd(year, -2,
dateadd(month, -1, getdate() - day(getdate()) + 1)
) as date) and
date < cast(getdate() - day(getdate()) + 1 as date)
这利用了向datetime
减去/添加数字的便利便利与添加日期相同。开始日期说:获取当月的第一天,然后减去一个月,然后减去两年。这可以作为dateadd(month, -25, . . .)
完成,但我认为分离逻辑更清楚。
答案 1 :(得分:1)
2年前的上个月的第一天:
SELECT CONVERT(DATE,dateadd(day, -1, dateadd(day, 1 - day(GETDATE()), GETDATE())))
上个月的最后一天:
SELECT CONVERT(DATE,DATEADD(month, DATEDIFF(month, 0, DATEADD(year,-2,GETDATE())), 0))
然后只需要用它们做任何你需要的逻辑
答案 2 :(得分:0)
这为您提供了两个您正在寻找的日期:
SELECT
CAST((DATEADD(yy, -2, DATEADD(d, -1 * DATEPART(dd, getdate()) + 1 , GETDATE() ))) as date) as yourTwoYearsAgoDate,
CAST((DATEADD(d, -1 * DATEPART(dd, GETDATE()), GETDATE())) as date) as yourEndOfLastMonthDate
答案 3 :(得分:0)
给定参考日期(例如&#34;今天&#34;),
declare @today date = '23 April 2015'
通过减去比当月的日期数少1来计算当月的第1天:
select first_of_current_month = dateadd(day,1-day(@today),@today)
上个月的最后一天是当月的第0天,因此要获取上个月的最后一天,只需减去当天的数字:
select last_of_previous_month = dateadd(day,-day(@today),@today)
两年前搬家很容易:
select two_years_back = dateadd(year,-2, @today )
总而言之,这应该是你:
declare @today date = '23 April 2015'
select *
first_day_of_current_month = dateadd(day,1-day(@today),@today),
last_day_of_previous_month = dateadd(day, -day(@today),@today) ,
date_from = dateadd(year,-2, dateadd(day,1-day(@today),@today) ) ,
date_thru = dateadd(day, -day(@today),@today)
产生预期的结果:
first_day_of_current_month: 2015-04-01
last_day_of_previous_month: 2015-03-31
date_from : 2013-04-01
date_thru : 2015-03-31
所以你应该能说出这样的话:
select *
from foo t
where t.transaction_date between dateadd(year,-2, dateadd(day,1-day(@today),@today) )
and dateadd(day, -day(@today),@today)
如果您必须处理datetime
值而不是date
,则更容易不使用between
并说出类似这样的内容:
declare @today date = current_timestamp -- get the current date without a time component
select *
from foo t
where t.transaction_date >= dateadd(year,-2, dateadd(day,1-day(@today),@today) )
and t.transaction_date < dateadd(year, 0, dateadd(day, -day(@today),@today)
[为了清晰起见,添加了多年的0年]