簡體   English   中英

在我的SQL where子句中需要動態日期

[英]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。 該鏈接對您有用。

TSQL循環數月

我想你要:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM