2017-08-29 115 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