2015-04-23 32 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

    相關問題