3.3.4.5 날짜 계산
MySQL은 나이 계산이나 날짜의 일부 추출 등 날짜 계산에 사용할 수있는 함수가 일부 포함되어 있습니다.
각각의 애완 동물이 몇 살인지를 판별하려면 TIMESTAMPDIFF() 함수를 사용합니다. 인수는 결과를 표현하는 단위 및 차에 대한 두 날짜입니다. 다음 쿼리는 각 애완 동물의 생년월일, 현재 날짜 및 나이가 표시됩니다. 출력의 마지막 컬럼 레이블에 의미를 부여하는 별칭 ( age )가 사용되고 있습니다.
mysql>SELECT name, birth, CURDATE(),->TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age->FROM pet;+----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | +----------+------------+------------+------+
이 쿼리는 제대로 작동하지만 결과 행을 어떤 순서로 볼 때 쉽게 파악할 것입니다. 따라서에는 ORDER BY name 절을 추가하여 출력을 이름별로 정렬 할 수 있습니다.
mysql>SELECT name, birth, CURDATE(),->TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age->FROM pet ORDER BY name;+----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | +----------+------------+------------+------+
출력을 name 대신 age 로 정렬하려면 다른 ORDER BY 절을 사용합니다.
mysql>SELECT name, birth, CURDATE(),->TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age->FROM pet ORDER BY age;+----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | +----------+------------+------------+------+
유사한 쿼리를 사용하여 죽은 애완 동물의 사망시 나이를 요청할 수 있습니다. 어떤 동물인지를 판단하려면 death 값이 NULL 여부를 확인합니다. 다음은 NULL 이 아닌 값에 대한 death 값과 birth 값의 차이를 계산합니다.
mysql>SELECT name, birth, death,->TIMESTAMPDIFF(YEAR,birth,death) AS age->FROM pet WHERE death IS NOT NULL ORDER BY age;+--------+------------+------------+------+ | name | birth | death | age | +--------+------------+------------+------+ | Bowser | 1989-08-31 | 1995-07-29 | 5 | +--------+------------+------------+------+
이 쿼리는 death <> NULL 이 아닌 death IS NOT NULL 을 사용합니다. NULL 은 보통 비교 연산자를 사용하여 비교할 수없는 특별한 가치이기 때문입니다. 이에 대해서는 나중에 설명합니다. 섹션 3.3.4.6 "NULL 값 작업" 을 참조하십시오.
다음달 생일을 맞이하는 애완 동물을 조사하려면 어떻게합니까? 이러한 계산의 경우 연도와 날짜는 무관하며 birth 컬럼의 달의 부분을 추출하기 만하면됩니다. MySQL은 YEAR() , MONTH() , DAYOFMONTH() 등 날짜의 일부를 추출하는 함수가 일부 포함되어 있습니다. 여기에서는 MONTH() 함수가 적합합니다. 작동 원리를 확인하기 위해 birth 와 MONTH(birth) 의 값을 모두 표시하는 간단한 쿼리를 실행합니다.
mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name | birth | MONTH(birth) |
+----------+------------+--------------+
| Fluffy | 1993-02-04 | 2 |
| Claws | 1994-03-17 | 3 |
| Buffy | 1989-05-13 | 5 |
| Fang | 1990-08-27 | 8 |
| Bowser | 1989-08-31 | 8 |
| Chirpy | 1998-09-11 | 9 |
| Whistler | 1997-12-09 | 12 |
| Slim | 1996-04-29 | 4 |
| Puffball | 1999-03-30 | 3 |
+----------+------------+--------------+
다음달 생일을 맞이하는 애완 동물을 찾을 수 쉽습니다. 지난 4 월이라고합니다. 달의 값은 4 이기 때문에 5 월 (월 5 )에 태어난 애완 동물은 다음과 같이 찾을 수 있습니다.
mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
+-------+------------+
| name | birth |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+
지난 12 월의 경우는 다소 복잡합니다. 달의 번호 ( 12 )에 단순히 1을 가산 해 13 월에 태어난 애완 동물을 찾는다는 것은 없습니다. 그러한 달은 존재하지 않기 때문입니다. 대신 1 월 (월 1 )에 태어난 애완 동물을 찾습니다.
현재이 무엇 월에도 작동하는 쿼리를 작성하면 특정 월의 번호를 사용할 필요가 없습니다. DATE_ADD() 를 사용하면 소정의 날짜에 시간 간격을 추가 할 수 있습니다. CURDATE() 의 값에 1 개월을 가산하고 월 부분을 MONTH() 에서 추출하면 생일을 조사하는 달을 얻을 수 있습니다.
mysql>SELECT name, birth FROM pet->WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
현재의 달의 값이 12 의 경우 모듈로 함수 ( MOD )를 적용하여 0 에 배치 후 1 을 가산하는 방법에서도 동일한 작업을 수행 할 수 있습니다.
mysql>SELECT name, birth FROM pet->WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
MONTH() 는 1 에서 12 까지의 숫자를 반환합니다. 또한 MOD(something,12) 는 0 에서 11 까지의 숫자를 반환합니다. 따라서 MOD() 의 후 가산을하지 않으면 11 월에서 1 월에 진행하게됩니다.