选择特定日期SQL

时间:2017-08-29 20:12:49

标签: sql sql-server

我有一份报告说我应该每月运行,并从去年同月的第21个月到本月的当月20日选择数据。 即现在是8月29日,今天我需要运行我的报告,但我希望它只显示08.21.2016-08.20.2017的数据,当我在9月份运行时,我想要数据来自09.20.2016-09.21.2017 ..

我正在使用

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

但它是近似的,我必须在每个月的20日准确地运行报告。

知道怎么做吗? TIA

5 个答案:

答案 0 :(得分: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日)
  • 减去一年

本月21日的逻辑相同。只是没有减去一年。

答案 1 :(得分: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

答案 2 :(得分:1)

如果您使用的是SQL Server 2012或更高版本,则可以使用DATEFROMPARTS函数...

SELECT 
    *
FROM
    dbo.MyTable mt
WHERE 
    mt.SomeDate >= DATEFROMPARTS(YEAR(GETDATE()) -1, MONTH(GETDATE()), 20);

答案 3 :(得分: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)))

答案 4 :(得分:0)

DECLARE @CurrentDate datetime = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) + 19
DECLARE @PriorDate datetime = DATEADD(YEAR, -1, @CurrentDate) + 1

SELECT @CurrentDate, @PriorDate