按下一个截止日期对MySQL表进行排序

时间:2010-03-15 04:20:32

标签: mysql

我有一个MySQL表,存储(除其他事项外)人的出生日期。

有没有办法对表格进行排序,以便下一个截止日期在顶部?

我的日期存储在标准的yyyy-mm-dd DATE格式中,并且单独的年,月和日字段,所以我可以按年份的第一个生日(ORDER BY month,day)对其进行排序,但我似乎无法看到进一步。

非常感谢任何帮助 Zagga

3 个答案:

答案 0 :(得分:0)

无需单独存储年,月,日 而且你也不需要订购你的桌子。

您所要做的就是按照自己的意愿订购查询 这样的事情应该让你开始:

  SELECT month(t.dob) as m, 
         dayofmonth(t.dob) as d, 
    FROM mytable t 
ORDER BY 1,2

答案 1 :(得分:0)

Select ...
From 'Table'
Where DayOfYear(BirthDate) <= DayOfYear(CurDate())
Order By DayOfYear(BirthDate) Desc

由于Where和Order By子句中大量使用了函数,因此可能效果不佳。

编辑 David Gelhar对完整列表有正确的想法。另一种方式是:

Select ...
From 'Table'
Where DayOfYear(BirthDate) <= DayOfYear(CurDate())
Order By Case
            When DayOfYear(BirthDate) <= DayOfYear(CurDate()) Then 0
            Else 1
            End ASC
    , DayOfYear(BirthDate)  DESC

同样,不是效果最好的查询,但它应该为您提供所需的答案。

答案 2 :(得分:0)

有趣的问题,因为要做得对,你需要获得今年的剩余生日,然后回到明年。类似的东西:

Select ...
From 'Table'
Where DayOfYear(BirthDate) >= DayOfYear(CurDate())
Order By DayOfYear(BirthDate)
union
Select ...
From 'Table'
Where DayOfYear(BirthDate) < DayOfYear(CurDate())
Order By DayOfYear(BirthDate)

修改 考虑到这一点,你实际上需要使用破碎的“月”和“日”字段,而不是仅仅查看DayOfYear;如果今年是闰年而且这个人出生在非闰年(反之亦然),那么你会得到错误的答案。那是因为我们认为我们的生日是“3月1日”,而不是“一年中的第60天”。

当然,你不能在UNION的两半中使用不同的“order by”条款......

所以,更像是:

Select 1,mon,day,name
From 'Table'
Where mon > Month(CurDate())
   or ((mon = Month(CurDate())) 
       and (day >= DayOfMonth(CurDate())))
union
Select 2,mon,day,name
From 'Table'
Where mon < Month(CurDate())
   or ((mon = Month(CurDate())) 
       and (day < DayOfMonth(CurDate())))
Order By 1,2,3