我有一份报告说我应该每月运行,并从去年同月的第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
答案 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日:
本月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