我希望找到一个解决方案来实现自动化报告。基本上我在这里试图完成的是抓取一个日期(上个月的第一天,两年前到本年前一个月的最后一天)。函数返回2年,上个月的第一天
所以日期跨度如果运行这个月应该是这样的:2013年4月1日和2015年3月31日
之间我发现代码来获得日期前两年,但我不能还包括月份功能...任何帮助非常感谢!
对于今年我使用这个:
SELECT CONVERT(VARCHAR(25),DATEADD(year,-2,GETDATE()),101)
我希望找到一个解决方案来实现自动化报告。基本上我在这里试图完成的是抓取一个日期(上个月的第一天,两年前到本年前一个月的最后一天)。函数返回2年,上个月的第一天
所以日期跨度如果运行这个月应该是这样的:2013年4月1日和2015年3月31日
之间我发现代码来获得日期前两年,但我不能还包括月份功能...任何帮助非常感谢!
对于今年我使用这个:
SELECT CONVERT(VARCHAR(25),DATEADD(year,-2,GETDATE()),101)
前一个月的第一天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))
然后,只需做你需要的任何逻辑与他们
你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, . . .)
,但我认为分离逻辑更清晰。
谢谢你的快速回复!第二部分(结束日期)出现错误“关键字'AS'附近的语法错误。” 和dateofservice> = CAST(DATEADD(年,-2, DATEADD(月,-1,GETDATE() - 天(GETDATE())+ 1) )的日期) \t \t \t \t \t \t和 \t \t \t \t \t \t dateofservice
'CAST(GETDATE() - 天(GETDATE())+ 1日)' – abatishchev
这给了你,你正在寻找两个日期:
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
给定参考日期(例如
select first_of_current_month = dateadd(day,1-day(@today),@today)
前一个月的最后一天:“今天”),
declare @today date = '23 April 2015'
每月的1日减去比天数当月少1计算是当前月份的第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几年又增加了清晰度]
谢谢,这对于更清楚地理解日期函数非常有帮助! – gfuller40
这对我有用! SELECT CONVERT(VARCHAR(25),dateadd(year,-2,dateadd(day,1-day(GETDATE()),GETDATE()))101 SELECT CONVERT(VARCHAR(25),DATEADD(MONTH,DATEDIFF (MONTH,-1,GETDATE())-1,-1),101) – gfuller40