【问题标题】:Order by birthday, disregarding year按生日排序,不考虑年份
【发布时间】:2012-06-28 02:45:29
【问题描述】:

您如何在完全不考虑年份的情况下查询您按生日排序的位置。我需要从今天的日期以 ASC 或 DESC 删除/忽略年份和 ORDER BYbirthdate 月份和生日日期。

以下内容将不起作用,因为生日的年份开始起作用。以下示例显示了考虑年份时会发生什么:

John   01/02/1974
Billy  11/15/2000
Ally   06/25/2008

SELECT * FROM users ORDER BY birthdate

按生日订购时的预期结果:

John   01/02/1974
Ally   06/25/2008
Billy  11/15/2000

【问题讨论】:

  • 如果您已经实施了选择的解决方案,您应该检查更新的答案。

标签: sql sql-server-2008 tsql sql-server-2005


【解决方案1】:

编辑:@AaronBertrand 的评论是正确的,day-of-year 不适用于闰年。你可以使用他的解决方案。另一种方法是按月和天排序,例如:

SELECT * FROM users ORDER BY month(birthdate), day(birthdate)

【讨论】:

  • 这还不够。在我的机器上尝试日期'2011-02-28','2011-03-01','2012-02-28','2012-02-29','2012-02-30'... 至少这会将2011-03-01 放在2012-02-29 之前。另外我建议拼出日期部分而不是使用速记。
【解决方案2】:

这会将所有日期标准化为 2000 年:

ORDER BY DATEADD(YEAR, 2000-YEAR(birthday), birthday);

这将正确处理闰年婴儿。

【讨论】:

  • 但是如果日期早于 1900 年呢? :)
  • 现在,我做到了! :) 只是不得不问,虽然
  • 这确实有效,但 Andomar 的解决方案完全忽略了年份,按年份排序。谢谢
  • @Patriotec 好的...我认为他的解决方案可能对闰年婴儿有挑战。我已经更正了。
  • +1 表示闰年评论。正确地做日期数学并不容易!
【解决方案3】:

试试

SELECT * FROM users ORDER BY SUBSTRING(birthdate, 1, 5);

【讨论】:

  • 如果列是日期/时间数据类型,这将不起作用,因为它不会按照用户呈现的方式存储。
【解决方案4】:

试试这个查询

按升序排列生日

SELECT `id`, `teacher_name`, `phn_num`, `date_of_birth`, `date_of_birth` + INTERVAL(YEAR(CURRENT_DATE()) - YEAR(`date_of_birth`)) + 0 YEAR AS currbirthday, `date_of_birth` + INTERVAL(YEAR(CURRENT_DATE()) - YEAR(`date_of_birth`)) + 1 YEAR AS nextbirthday FROM `teacher_details` ORDER BY CASE WHEN currbirthday >= CURRENT_DATE() THEN currbirthday ELSE nextbirthday END

【讨论】:

    猜你喜欢
    • 2014-06-30
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多