2017-08-29 220 views
2

我有一個報告,我應該每個月都運行一次,並從去年同月的第21天至當前月的第20天選擇數據。 ie即8月29日現在和今天我需要運行我的報告,但我希望它只顯示08.21.2016-08.20.2017的數據,當我在9月運行時,我需要09.20.2016-09.21.2017的數據。 ..選擇特定日期SQL

我用

Select * 
from invt 
where DATE > (GETDATE()-365) 

,但它是近似的,我必須在每個月的20日恰好運行報告。

任何想法如何做到這一點? TIA

+0

https://stackoverflow.com/questions/37575216/where-date-的可能重複一年前和現在 –

回答

2

應工作有:

SELECT * 
    FROM invt 
WHERE DATE BETWEEN 
     DATEADD(YEAR,-1,DATEADD(DAY,19,DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0))) 
    AND DATEADD(DAY,20, DATEADD(MONTH,DATEDIFF(MONTH,0, GETDATE()),0)) 

看起來嚇人,但它基本上是做簡單的事情:

去年的20:

  • 獲取當前日期
  • 只取月份(月初)
  • 添加19天(現在我們是在當月20日)
  • 。減去1年

漂亮了當月的21號相同的邏輯。只是沒有減少一年。

+0

哦,太棒了!這是我需要的。 Thx詳細的解釋。 – Monika

0

可以使用獲得當月的21日:

dateadd(day, 21 + 1 - day(getdate()), cast(getdate() as date)) 

如果你想從一年前:

where date < dateadd(day, 21 + 1 - day(getdate()), cast(getdate() as date)) and 
     date >= dateadd(year, 1, dateadd(day, 21 + 1 - day(getdate()), cast(getdate() as date))) 
1

另一種選擇,如果2012+

Where Date between format(DateAdd(YEAR,-1,GetDate()),'yyyy-MM-21') 
       and format(GetDate(),'yyyy-MM-20') 

的日期將是2016-08-21 and 2017-08-20

+0

您應該避免使用FORMAT功能。與CAST或CONVERT相比,已經進行了相當多的測試和表演。 –

+0

@ JasonA.Long充分了解Format()的性能。但是,這將被稱爲/解決一次不記錄記錄。 –

+0

不夠公平......但是,當下一次他們需要在相關的子查詢中執行此操作或交叉應用時,OP是否會意識到這一點? –

1

如果你使用SQL Server 2012或更高版本,可以使用DATEFROMPARTS功能...

SELECT 
    * 
FROM 
    dbo.MyTable mt 
WHERE 
    mt.SomeDate >= DATEFROMPARTS(YEAR(GETDATE()) -1, MONTH(GETDATE()), 20); 
0
DECLARE @CurrentDate datetime = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) + 19 
DECLARE @PriorDate datetime = DATEADD(YEAR, -1, @CurrentDate) + 1 

SELECT @CurrentDate, @PriorDate