EDITED
SELECT
*
,CASE
WHEN CURDATE() <= startDate THEN startDate + INTERVAL 3 year
WHEN MOD((YEAR(CURDATE()) - YEAR(startDate)),3) = 0
AND (CURDATE() - INTERVAL YEAR(CURDATE()) year)
<= (startDate - INTERVAL YEAR(startDate) year)
THEN startDate + INTERVAL (YEAR(CURDATE()) - YEAR(startDate)) year
ELSE startDate + INTERVAL (year(CURDATE()) - YEAR(startDate) + 3 - MOD(YEAR(CURDATE()) - YEAR(startDate),3)) year
END as "Next3YrAniversary"
FROM
TableName
SQL小提琴向你展示它与测试用例工作: http://www.sqlfiddle.com/#!9/cf276a/1
反正思路如下:
startDate is Today or in future if so just add 3 years
Remainder of (Yesrs Diff/3) = 0
and
if current month/day is <= month/day of startDate
如果是这样的周年是今年,并且还没有发生,那么add number of years between current date and startDate to startDate
。要说这是一种稍微不同的方式,如果它是2016
而周年纪念是2016
它将会看到这个周年是否会在今年发生。
- 否则添加到起始日期:
Number of years between Start Date & Now + 3 years - Remainder of (Years between Now and startDate/3)
的注意事项有关YEAR()
VS year
。你可以写year()
或YEAR()
我倾向于大写我的特定功能等,但year()函数只获取日期年的INT
。因此YEAR(CURDATE())
表示获得当前日期的年份,例如2016
,YEAR(startDate)
获得例如startDate
的年份。 2013
。 MOD()
为您提供了从分裂所以2/3 remainder 1
2016 - 2013 gives you 3 so remainder of 3/3 is 0
下一年的情况下这是不是一个函数[不带括号]余定义的时间间隔类型,你可以使用一天,一年,一个月,等
date INTERVAL + 1 year = add 1 year to date
另一个例子是
startDate INTERVAL + NumOfYearsDiff year = add NumOfYearsDiff to startDate
在第二种情况下进行比较时,我做的是通过减去日期的年份整数使这两个日期基本上是YEAR 0001
,然后比较哪会告诉我哪个日期以便在今年晚些时候了解这个周年纪念日是否已经过去,或者今年还会继续。 TIMESTAMPDIFF
会自动为您取得学位,但如果您使用,那么周年日期将是下一个日期,例如2019
如果是在2016
。所以如果你想今天展示它,你仍然必须检查我所做的相同条件,这意味着没有真正的理由使用TIMESTAMPDIFF
。
这里是我的方法,斯宾塞的侧面比较sqlfiddle侧,和戈登的 http://www.sqlfiddle.com/#!9/cf276a/3
显示内容:
- 如果今天纪念日是戈登的&斯宾塞的方法,会显示下一个周年如今天+ 3年。哪些可能或不可能被期望?
- 戈登的回答为未来的日期将显示起始日期代替的startDate +3年
@KamilG怎么这样?从今天起的下一个周年将不得不是08/25/2019。 – CodeCrack
你想为闰日聘用的员工做什么? – pilcrow
@CodeCrack闰日实际上是一个很好的问题,但我会假设你并不在乎这么多。我的回答,我相信其他人会假设周年日期将在2/28而不是2/29。这里是一个sqlfiddle,展示了mysql如何将多年的加入视为闰日。 http://www.sqlfiddle.com/#!9/f35e91/5 – Matt