在忽略年份的两个日期之间进行选择
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));
我需要一种在忽略年份的两个动态日期之间正确选择的方法。
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));