在两个日期之间选择,忽略年份

时间:2015-07-30 19:21:58

标签: sql select sql-server-2008-r2

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

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

任何帮助都会很棒!感谢

2 个答案:

答案 0 :(得分:1)

我相信您可以比较几个月的时差模数,以匹配不论年份的月份和日期。您只需要处理可接受范围内的第一个月和最后几个月的日期。我已经在下面完成了这个,但由于我没有安装SQL Server,我无法测试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));

答案 1 :(得分:0)

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

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()))