在忽略年份的两个日期之间进行选择

Selecting between two dates ignoring the year

我需要一种在忽略年份的两个动态日期之间正确选择的方法。

Dates here are listed as mm/dd/YYYY

我们有一个 expiration_dates 的列表,其中年份与我们无关。我需要找到登陆 between 1 and 4 months out(30 天和 120 天)的所有记录。例如:如果当前日期是 11/01/XXXX,我需要在 12/01/XXXX 和 02/01/XXXX 之间搜索。

当前无效的解决方案:

SELECT expiration_date
FROM mytable
Where
    DATEDIFF( day, DATEADD( year, DATEDIFF( year, expiration_date, getdate()), expiration_date), getdate()) <= -30
    AND DATEDIFF( day, DATEADD( year, DATEDIFF( year, expiration_date, getdate()), expiration_date), getdate()) >= -120

只要边界不超出当前年份,上述方法就有效。

示例数据:

10/17/2014
12/07/2015
05/28/2007
05/17/2013
02/27/2015
11/02/2010

预期结果:

11/02/2010
12/07/2015

任何帮助都会很棒!谢谢

如果我正确理解标准,这应该会达到预期的结果:

SELECT expiration_date
Where
(DATEPART(month,expiration_date) BETWEEN 
(DATEPART(month,getdate()) + 1) % 12
AND DATEPART(month,getdate()) + 4) % 12)
AND DATEDIFF(day,getdate(),expiration_date) >= 30)

OR

(DATEPART(month,getdate()) + 4 > 12
AND DATEPART(month,expiration_date) <= DATEPART(month,getdate()) + 4) % 12
AND (DATEPART(month,expiration_date <> (DATEPART(month,getdate()) + 4) % 12
     OR DATEPART(day,expiration_date) < DATEPART(day,getdate()))

我相信您可以比较以月为单位的时差模数以匹配月份和日期,而不管年份。您只需要在可接受的范围内处理第一个月和最后一个月的日期。我在下面做了这个,但是因为我没有安装 SQL 服务器,所以我无法测试 DATEDIFF 如何处理月份,但我假设它在这里给出整数。

SELECT expiration_date FROM mytable 
  WHERE (DATEDIFF(month,GETDATE(),expiration_date) % 12 IN (1, -11) AND DATEPART(day,expiration_date) >= DATEPART(day,GETDATE()))
  OR (DATEDIFF(month,GETDATE(),expiration_date) % 12 IN (4, -8) AND DATEPART(day,expiration_date) < DATEPART(day,GETDATE()))
  OR (DATEDIFF(month,GETDATE(),expiration_date) % 12 IN (2, 3, -9, -10));