2015-04-23 93 views
1

我希望找到一个解决方案来实现自动化报告。基本上我在这里试图完成的是抓取一个日期(上个月的第一天,两年前到本年前一个月的最后一天)。函数返回2年,上个月的第一天

所以日期跨度如果运行这个月应该是这样的:2013年4月1日和2015年3月31日

之间我发现代码来获得日期前两年,但我不能还包括月份功能...任何帮助非常感谢!

对于今年我使用这个:

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

回答

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

然后,只需做你需要的任何逻辑与他们

+0

这对我有用! 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

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, . . .),但我认为分离逻辑更清晰。

+0

谢谢你的快速回复!第二部分(结束日期)出现错误“关键字'AS'附近的语法错误。” 和dateofservice> = CAST(DATEADD(年,-2, DATEADD(月,-1,GETDATE() - 天(GETDATE())+ 1) )的日期) \t \t \t \t \t \t和 \t \t \t \t \t \t dateofservice gfuller40

+1

'CAST(GETDATE() - 天(GETDATE())+ 1日)' – abatishchev

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 
+0

我得到这个错误,我在SQL Server 2008上,是否有问题? – gfuller40

+0

消息243,级别16,状态1,行1 类型日期不是定义的系统类型 – gfuller40

0

给定参考日期(例如

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几年又增加了清晰度]

  • +0

    谢谢,这对于更清楚地理解日期函数非常有帮助! – gfuller40

    相关问题