功能可以追溯到上个月的第一天2年

时间:2015-04-23 17:14:11

标签: sql sql-server sql-server-2008 tsql date

我希望找到一个解决方案来自动化我的报告。基本上我在这里要完成的是抓住一个日期(上个月的第一天,两年前到当月的前一个月的最后一天)。

因此,如果本月运行的日期跨度如下所示:2013年4月1日至2015年3月31日之间

我找到了两年前获得日期的代码,但我无法合并月份功能......非常感谢任何帮助!

我正在使用这一年:

SELECT CONVERT(VARCHAR(25),DATEADD(year,-2,GETDATE()),101)

4 个答案:

答案 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年]