我希望找到一個解決方案來實現自動化報告。基本上我在這裏試圖完成的是抓取一個日期(上個月的第一天,兩年前到本年前一個月的最後一天)。函數返回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