本文介绍了根据当前日期对即将到来的生日进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有下表的人和他们的生日:

I have the following table of people and their birthdays:

name        birthday
----------------------
yannis      1979-06-29
natalia     1980-08-19
kostas      1983-10-27    
christos    1979-07-22
kosmas      1978-04-28

,我不知道如何根据生日离今天的距离来对名字进行排序.因此,对于NOW()= 2011-09-08,排序结果应为:

and I have no idea how to sort the names on how closer the birthday is to today. So for NOW() = 2011-09-08 the sorted result should be:

kostas      1983-10-27
kosmas      1978-04-28
yannis      1979-06-29
christos    1979-07-22
natalia     1980-08-19

我正在寻找一个快速的技巧,并不真正在意性能(pet项目-表将容纳少于1000条记录),但是当然每个建议都将不胜感激.

I'm looking for a quick hack, don't really care for performance (pet project - table will hold less than 1000 records), but of course every suggestion will be extremely appreciated.

推荐答案

这是一种方法:

  • 计算当前年份-出生年份
  • 将得出的年数加到出生日期
  • 您现在是今年的生日,如果这个日期过去了,再增加一年
  • 在该日期之前对结果进行排序
  • Calculate current year - year of birth
  • Add the resulting number of years to the date of birth
  • You now have the birthday this year, if this date has passed then add one more year
  • Sort the results by that date
SELECT
    name,
    birthday,
    birthday + INTERVAL (YEAR(CURRENT_DATE) - YEAR(birthday))     YEAR AS currbirthday,
    birthday + INTERVAL (YEAR(CURRENT_DATE) - YEAR(birthday)) + 1 YEAR AS nextbirthday
FROM birthdays
ORDER BY CASE
    WHEN currbirthday >= CURRENT_DATE THEN currbirthday
    ELSE nextbirthday
END

注意:

  • 无论当前时间如何,今天的生日都会首先出现
  • 2月29日的生日与普通年的2月28日的生日相同,例如
    • 在2019年1月1日对2月28日和2月29日生日(2019年)进行了相等的排序
    • 在2019年3月1日的2月28日和2月29日生日(2020年)按预期排序
    • Today's birthdays appears first regardless of current time
    • February 29 birthday is treated equal to February 28 birthday for common years e.g.
      • On Jan/1/2019 both Feb 28 and Feb 29 birthdays (2019) are sorted equal
      • On Mar/1/2019 Feb 28 and Feb 29 birthdays (2020) are sorted as expected

      SQLFiddle

      这篇关于根据当前日期对即将到来的生日进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-25 04:34