복붙노트

[SQL] 현재 날짜를 기준으로 정렬 다가오는 생일

SQL

현재 날짜를 기준으로 정렬 다가오는 생일

나는 사람들과 자신의 생일 다음과 같은 테이블이 있습니다 :

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을 = 그래서 위해 정렬 된 결과가 있어야한다 :

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

(- 표는 1000 개 미만의 기록을 개최한다 애완 동물 프로젝트),하지만 물론 모든 제안은 매우 이해할 수있을 것이다 정말 성능에 대한 상관 없어, 빠른 해킹을 찾고 있어요.

해결법

  1. ==============================

    1.여기에 한 가지 방법은 다음과 같습니다

    여기에 한 가지 방법은 다음과 같습니다

    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
    

    노트:

    SQLFiddle

  2. ==============================

    2.

    SELECT name
         , birthday
    FROM TableX
    ORDER BY DAYOFYEAR(birthday) < DAYOFYEAR(CURDATE())
           , DAYOFYEAR(birthday)
    

    아니, 위 인해 366일와 년, 오류 결과가 발생할 수 있습니다. 이 올바른 것입니다 :

    SELECT name
         , birthday
    FROM
      ( SELECT name
             , birthday
             , MONTH(birthday) AS m
             , DAY(birthday) As d
        FROM TableX
      ) AS tmp
    ORDER BY (m,d) < ( MONTH(CURDATE()), DAY(CURDATE()) )
           , m
           , d
    

    테이블이 몇 수천 기록보다 이상으로 증가하면, 그것은 아주 천천히 될 것입니다. 당신이 빠른 쿼리를 원하는 경우 17 또는 지능 (817 (17 ~ 8 월을 위해 08-17 또는 0817)를, 월과 일에 필드를 추가하고, 하나 숯불을 (bmonth, bday)에 인덱스를하거나 하나 개의 필드로 추가 -Aug) 및 해당 필드에 대한 인덱스.

  3. ==============================

    3.오히려 빠른, 윤년에 문제가 될 것 같습니다 :

    오히려 빠른, 윤년에 문제가 될 것 같습니다 :

    SELECT * 
    FROM `people` 
    ORDER BY CONCAT(SUBSTR(`birthday`,6) < SUBSTR(CURDATE(),6), SUBSTR(`birthday`,6))
    

    모든 화려한 - 쉽게! ;)

  4. ==============================

    4.아니 꽤 있지만, 작품

    아니 꽤 있지만, 작품

    SELECT * 
    ,CASE WHEN BirthdayThisYear>=NOW() THEN BirthdayThisYear ELSE BirthdayThisYear + INTERVAL 1 YEAR END AS NextBirthday
    FROM (
        SELECT * 
        ,birthday - INTERVAL YEAR(birthday) YEAR + INTERVAL YEAR(NOW()) YEAR AS BirthdayThisYear
        FROM bd
    ) AS bdv
    ORDER BY NextBirthday
    
  5. ==============================

    5.나는이 같은 그것을 시도 할 것이다 (하지만이 테스트되지 않음) :

    나는이 같은 그것을 시도 할 것이다 (하지만이 테스트되지 않음) :

    SELECT
      name,
      birthday
    FROM
      birthdays
    ORDER BY
      ABS( DAYOFYEAR(birthday) - (DAYOFYEAR(CURDATE()) ) ASC
    

    편집하다: 먼저 가장 멀리 싶어하기 때문에 가장 가까운하지, ASC에 DESC에서 순서를 변경했습니다.

  6. from https://stackoverflow.com/questions/7343807/sort-upcoming-birthdays-based-on-current-date by cc-by-sa and MIT license