我需要一种方法来在两个动态日期之间正确选择,忽略年份。
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
任何帮助都会很棒!感谢
答案 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()))