2014-09-25 2 views
0

으로 다가오는 생일을 선택할 수있는 우아한 방법으로, 단 하나의 select 문으로 MySQL 데이터베이스에서 다가오는 생일을 알 수있는 "좋은"해결책을 찾지 못했습니다. 웹에서 여러 가지 전략을 발견했지만 그 중 누구도 올해의 변화에 ​​특히 잘 작동하지 않았습니다. 결과는 (생일 연도 변경 후입니다 또한 경우) 모든 다가오는 생일에 목록이 될 것입니다잠시 후 검색 한 후 MySQL

SELECT mem_id, mem_dateBirth, MONTH(mem_dateBirth), DAY(mem_dateBirth) 
FROM rs_mem 
WHERE mem_dateBirth IS NOT NULL AND 
     mem_dateBirth > '1900-01-01' 
ORDER BY (date_format(NOW(), '%m%d') >= date_format(mem_dateBirth, '%m%d')), 
     date_format(mem_dateBirth, '%m%d'); 

:

지금 내 최종 솔루션을 공유하고자합니다.

+0

귀하의 맥락에서 '다가오는 생일'이 무엇을 의미하는지 설명해 주실 수 있습니까? – Jens

+0

안녕하세요. Jens, 내 맥락에서 나는 생일 (NOW())의 다음 친척이 될 회원 (사용자)을 구하고 싶다는 의미입니다. –

+0

당신이 다음에 무엇을 알고 있다면 날짜를 비교할 수 있습니다 :'select * from rs_mem where mem_dateBirth between now() mem_dateBirth by order ' – Jens

답변

0

귀하의 질의는 여기에, 잘하는 CASE 문을 사용하여 결과를 주문하는 또 다른 방법입니다 :

SELECT M.mem_id 
    , M.mem_dateBirth 
    , MONTH(mem_dateBirth) AS month 
    , DAY(mem_dateBirth) AS day 
FROM rs_mem M 
WHERE IFNULL(M.mem_dateBirth, '1900-01-01') > '1900-01-01' 
ORDER BY CASE 
      WHEN DATE_FORMAT(M.mem_dateBirth, '%m%d') >= DATE_FORMAT(NOW(), '%m%d') THEN 1 
      ELSE 0 
     END DESC, date_format(mem_dateBirth, '%m%d'); 

가 나는 또한 (IFNULL의 사용)이 짧게하기 위해 귀하의 WHERE 절을 수정했습니다.

희망이 도움이 될 것입니다.

0

MSSQL : TOP 10은 처음 10 개 레코드이므로 모든 레코드에서 제거 할 수 있습니다.

SELECT TOP 10 mem_id, mem_dateBirth, MONTH(mem_dateBirth), DAY(mem_dateBirth) 
FROM rs_mem 
WHERE mem_dateBirth IS NOT NULL AND 
     mem_dateBirth > '1900-01-01' AND 
     mem_dateBirth > DATE() 
ORDER BY mem_dateBirth 

MYSQL : 제한 0,10은 처음 10 레코드입니다. 모든 레코드에 대해이를 제거 할 수 있습니다.

SELECT mem_id, mem_dateBirth, MONTH(mem_dateBirth), DAY(mem_dateBirth) 
    FROM rs_mem 
    WHERE NOT isnull(mem_dateBirth) AND 
      mem_dateBirth > '1900-01-01' AND 
      mem_dateBirth > CURDATE() 
    ORDER BY mem_dateBirth limit 0,10 
+0

안녕하세요, 귀하의 의견에 감사드립니다 - 불행히도 'mem_dateBirth> CURDATE()'가 미래에 생일을 찾고 있기 때문에 결과가 표시되지 않습니다. –

관련 문제