Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 특정 날짜의 마지막 순간(23:59:59) 구하는 방법

MySQL에서 특정 날짜의 마지막 순간, 즉 그날의 마지막 초(23:59:59)를 구하려면 INTERVAL 연산을 활용하면 됩니다. 이 방법은 날짜에 하루를 더한 뒤 1초를 빼는 간단한 원리로 동작합니다.

1. 테이블 생성하기

먼저 예제에 사용할 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
-> (
-> JoiningDatetime datetime,
-> DueDatetime datetime
-> );
Query OK, 0 rows affected (0.55 sec)

입사 일시(JoiningDatetime)와 만기 일시(DueDatetime) 두 개의 DATETIME 컬럼으로 구성된 테이블입니다.

2. 데이터 삽입하기

INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable(JoiningDatetime) values('2019-11-03 12:34:54');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(JoiningDatetime) values('2019-10-04 12:34:54');
Query OK, 1 row affected (0.13 sec)

3. 저장된 데이터 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다.

+---------------------+-------------+
| JoiningDatetime | DueDatetime |
+---------------------+-------------+
| 2019-11-03 12:34:54 | NULL |
| 2019-10-04 12:34:54 | NULL |
+---------------------+-------------+
2 rows in set (0.00 sec)

아직 DueDatetime 컬럼에는 값이 입력되지 않아 NULL로 표시됩니다.

4. INTERVAL을 이용해 해당 날짜의 마지막 초 구하기

다음 쿼리를 사용하면 JoiningDatetime 날짜 기준으로 그날의 마지막 순간(23:59:59)을 계산하여 DueDatetime에 저장할 수 있습니다.

mysql> update DemoTable
-> set DueDatetime=DATE(JoiningDatetime) + INTERVAL 1 DAY - INTERVAL 1 SECOND;
Query OK, 2 rows affected (0.19 sec)
Rows matched: 2 Changed: 2 Warnings: 0

여기서 사용된 연산 로직을 살펴보면 다음과 같습니다.

  • DATE(JoiningDatetime): 시간 정보를 제거하고 순수한 날짜 값만 추출합니다. 예를 들어 '2019-11-03 12:34:54'는 '2019-11-03'이 됩니다.
  • + INTERVAL 1 DAY: 날짜에 하루를 더해 다음 날 자정(00:00:00)으로 이동합니다.
  • - INTERVAL 1 SECOND: 1초를 빼면 해당 날짜의 마지막 순간인 23:59:59가 됩니다.

5. 결과 확인하기

업데이트 후 테이블을 다시 조회해 보겠습니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다.

+---------------------+---------------------+
| JoiningDatetime | DueDatetime |
+---------------------+---------------------+
| 2019-11-03 12:34:54 | 2019-11-03 23:59:59 |
| 2019-10-04 12:34:54 | 2019-10-04 23:59:59 |
+---------------------+---------------------+
2 rows in (0.00 sec)

시간 정보와 관계없이 각 날짜의 마지막 순간인 23:59:59가 정확하게 계산되어 저장된 것을 확인할 수 있습니다.

참고: 대체 방법

MySQL 8.0 이상에서는 LAST_DAY(), CURDATE() 등과 조합하거나, 아래와 같은 방식으로도 동일한 결과를 얻을 수 있습니다.

-- TIMESTAMP 함수를 활용하는 방법
SELECT TIMESTAMP(DATE(JoiningDatetime), '23:59:59') FROM DemoTable;

또한 일반적으로 '하루의 끝'을 나타낼 때는 23:59:59보다 '다음 날 00:00:00 미만' 조건(< DATE + INTERVAL 1 DAY)을 사용하는 것이 경계값 오류를 방지할 수 있어 더 안전한 방식으로 권장됩니다.