사용자의 생년월일에 해당하는 타임스탬프 데이터(예: user_table
)를 저장하는 birthday
필드가 있는 사용자 데이터 테이블1994-01-01、1996-07-1
이 있습니다
이제 페이지의 사용자 데이터를 최근부터 생일 순으로 검색해야 합니다.
예를 들어 오늘이 2016-07-28
이면 생일 날짜는 1995-07-30
, 1993-11-31
입니다. , 1997-08-29
, 1995-07-27
의 4개 사용자 데이터는 1995-07-30
, 1997-08-29
, 1993-11-31
, 1995-07-27
이러한 쿼리 조건을 만족하는 SQL 문은 어떻게 작성하나요?
또는 생일을 저장하는 데이터 테이블의 구조를 적절하게 수정하려면 어떻게 해야 합니까?
사용자의 생년월일에 해당하는 타임스탬프 데이터(예: user_table
)를 저장하는 birthday
필드가 있는 사용자 데이터 테이블1994-01-01、1996-07-1
이 있습니다
이제 페이지의 사용자 데이터를 최근부터 생일 순으로 검색해야 합니다.
예를 들어 오늘이 2016-07-28
이면 생일 날짜는 1995-07-30
, 1993-11-31
입니다. , 1997-08-29
, 1995-07-27
의 4개 사용자 데이터는 1995-07-30
, 1997-08-29
, 1993-11-31
, 1995-07-27
이러한 쿼리 조건을 만족하는 SQL 문은 어떻게 작성하나요?
또는 생일을 저장하는 데이터 테이블의 구조를 적절하게 수정하려면 어떻게 해야 합니까?
데이터 볼륨 및 성능 문제에 관계없이 간단한 접근 방식:
dayofyear 정보를 저장하는 필드를 추가합니다. 예를 들어 필드 이름이 day_of_year이면 삽입 문은 다음과 같습니다.
<code class="mysql">insert into user_table set ... = ..., day_of_year = DAYOFYEAR('1995-07-30');</code>
쿼리 시 두 번 쿼리합니다. day_of_year 필드가 현재 값보다 큰지 먼저 쿼리한 다음 이 필드가 현재 값보다 작은지 쿼리하고 day_of_year별로 정렬합니다.
<code class="mysql">select * from user_table where day_of_year >= DAYOFYEAR(CURDATE()) order by day_of_year asc; select * from user_table where day_of_year < DAYOFYEAR(CURDATE()) order by day_of_year asc;</code>
한 가지 적은 조건을 보세요
mysql은 1995-07-30 시간을 DAYOFYEAR('1995-07-30')로 변환하고, 오늘의 날을 빼면 Days가 됩니다. 차이가 있어서 주문하세요.
생년월일이 같은 경우 연도별 오름차순으로 정렬할 수 있습니다.
<code>select * from user_table order by (DAYOFYEAR(birthday)-DAYOFYEAR(curdate())),year(birthday) ASC</code>
아이디어: 실제로 수행하는 작업은 먼저 뺄셈 후 월을 기준으로 정렬한 다음 뺄셈 후 일을 기준으로 정렬하는 것입니다.
<code>mysql> SELECT name, birthday FROM user_table -> WHERE MONTH(birthday) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH)) -> ORDER BY DAY(birthday) asc; </code>
위 코드는 당월로부터 1개월 후의 생일 데이터를 가져와서 날짜 오름차순으로 정렬하면 다음 항목을 꺼내기 위해 반복하면 됩니다
<code>DROP TEMPORARY TABLE IF EXISTS aa; DROP TEMPORARY TABLE IF EXISTS bb; create temporary table aa(select birthday from user_table WHERE substring(birthday,6,10)>'07-28' ORDER BY substring(birthday,6,10) asc); create temporary table bb(select birthday from user_table WHERE substring(birthday,6,10)<'07-28' ORDER BY substring(birthday,6,10) asc ); SELECT * FROM aa Union All SELECT * FROM bb 测试了一下,效果如图所示</code>
1995-07-30
1997-08-29
1993-11-31
1999-01-01
1995-07-27