[英]Need dynamic dates in my SQL where clause
我需要在SQL Server 2012中編寫一個(我的第一個)簡單的存儲過程,該過程將在每月的1號運行。 每次運行時,數據都必須是最近3個月的數據。
我需要WHERE
子句基於table.STARTDATE
,它介於過去3個月的日期之間。
因此,當它於7月1日運行時,它必須是:
WHERE t.STARTDATE BETWEEN '2018-04-01' AND '2018-06-30'
並且在8月1日運行時,它必須是:
WHERE t.STARTDATE BETWEEN '2018-05-01' AND '2018-07-31'
等等。
好的,我只是嘗試了一下,直到本月的最后一天才真正進行驗證。 這行得通嗎?
BETWEEN DATEADD(m, -3, GETDATE()) AND DATEADD(dd, -1, GETDATE())
您正確安裝了它( 假設時間碼無關緊要 )。
就像做僅供參考的FYI,您必須記住可以將日期強制放入代碼中進行測試。
因此:
SELECT dateadd(m,-3,'08/01/2018'), dateadd(dd,-1,'08/01/2018')
SELECT dateadd(m,-3,'07/01/2018'), dateadd(dd,-1,'07/01/2018')
它將在7月1日和8月1日(您的理論日期)對其進行測試
一種方法是使用CTE。 該鏈接對您有用。
我想你要:
where t.STARTDATE >= dateadd(month, -3, datefromparts(year(getdate()), month(getdate()),
1)) and
t.STARTDATE < datefromparts(year(getdate()), month(getdate()), 1)
由於某些原因,您不應該習慣between
日期between
使用“ between
,因此我將您引薦給Aaron Bertrand的博客, “之間和魔鬼有什么共同點”?
您可以通過定義日期來做到這一點,這里的getdate()
將成為您的table.STARTDATE
declare @myStartdate date=dateadd(MM, -3,getdate())
declare @myEnddate date=dateadd(MM, -1,getdate())
SELECT getdate() as today, CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@myStartdate)-1),@myStartdate),101) AS Date_start_Value,
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@myEnddate))),
DATEADD(mm,1,@myEnddate)),101) as date_end_value
這將返回
today Date_start_Value date_end_value
2018-06-20 21:34:07.180 03/01/2018 05/31/2018
現在您可以在where子句中使用以上內容
WHERE t.STARTDATE BETWEEN
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@myStartdate)-1),@myStartdate),101)
AND
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@myEnddate))),
DATEADD(mm,1,@myEnddate)),101)`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.