[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.여기에 한 가지 방법은 다음과 같습니다
여기에 한 가지 방법은 다음과 같습니다
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.
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.오히려 빠른, 윤년에 문제가 될 것 같습니다 :
오히려 빠른, 윤년에 문제가 될 것 같습니다 :
SELECT * FROM `people` ORDER BY CONCAT(SUBSTR(`birthday`,6) < SUBSTR(CURDATE(),6), SUBSTR(`birthday`,6))
모든 화려한 - 쉽게! ;)
-
==============================
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.나는이 같은 그것을 시도 할 것이다 (하지만이 테스트되지 않음) :
나는이 같은 그것을 시도 할 것이다 (하지만이 테스트되지 않음) :
SELECT name, birthday FROM birthdays ORDER BY ABS( DAYOFYEAR(birthday) - (DAYOFYEAR(CURDATE()) ) ASC
편집하다: 먼저 가장 멀리 싶어하기 때문에 가장 가까운하지, ASC에 DESC에서 순서를 변경했습니다.
from https://stackoverflow.com/questions/7343807/sort-upcoming-birthdays-based-on-current-date by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 페이스 북은 운영자와 같은 SQL이 FQL 있습니까? (0) | 2020.07.09 |
---|---|
[SQL] Critieria API를 NHibernate에있는 하위 쿼리에서 선택 (0) | 2020.07.09 |
[SQL] 두 날짜 사이의 일 수 - ANSI SQL (0) | 2020.07.09 |
[SQL] C # 및 SQL Server 관리 Studio에서 SQL 쿼리의 매우 다른 실행 시간 (0) | 2020.07.09 |
[SQL] 각 카테고리에서 MYSQL 하나를 선택 랜덤 기록 (0) | 2020.07.09 |