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
월에 진행하게됩니다.