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