본문 바로가기
database/mysql

MySQL 날짜형 데이터 타입 : DateTime, Date, Time (ft.오늘의 milliseconds 계산하기)

by developer_j 2025. 8. 26.
728x90
반응형
NOW() -> 현재 날짜/시간 반환, DateTime형
CURDATE() -> 현재 날짜 반환,Date형
INTERVAL -> 시간,날짜 계산시 사용하는 키워드

오라클에는 날짜형 데이터 타입이 DateTime, Timestamp 두가지 정도밖에 없는 것과 다르게

Mysql은 Date, Time, DateTime, Timestamp, Year .. 여러가지가 있는 것 같다

어떻게 보면 Mysql 쪽이 데이터타입이 많으니 뭔가 더 복잡한 것 같은데, 사실 데이터를 가져와서 이리저리 가공하는 경우가 더 많기때문에,, 그게 싫은 개발자라면 Mysql 쪽이 편할 수도 있겠다라는 생각을 하게 되었다. 그래도 난 오라클쪽이 더 직관적이고 유지보수하기 편할 것 같다. 기획자가 처음에는 년도만 필요한 것 같이 기획했지만 추후에 변경할 수가 있기 때문이당

 


 

 

날짜형 데이터 타입 대표적인 3가지 : DateTime, Date, Time

 

함수명 설명 반환되는 데이터 예시 반환 데이터 타입
NOW() 현재 날짜 + 시간 반환 2025-08-26 13:25:40 DATETIME (YYYY-MM-DD HH:MM:SS)
CURDATE() 현재 날짜 반환 2025-08-26 DATE
CURTIME() 현재 시간 반환 13:25:40 TIME

 

oracle 은 시스템 값이나 함수 결과를 얻고 싶을 때 "FROM DUAL;" 을 사용하지만 mysql 은 쓰지 않아도 된다.

select now(), curdate(), curtime();

 

 

 

TIMESTAMPDIFF (TIMEDIFF, DATEDIFF, ...)

내가 목표한 것은
오늘 날짜 00시 (2025-08-26 00:00:00) 기준으로, 현재 시간이 얼마나 흘렀는지 milliseconds 를 계산하는 것.

CURDATE() + INTERVAL 0 HOUR; 을 조회하면 2025-08-26 00:00:00   로 값이 나오길래
단순하게 SELECT CURDATE() - NOW(); 를 하면 될 줄 알았으나 이상한 값이 나왔다.

MariaDB [mydb]> SELECT CURDATE() - NOW();

+-------------------+
| CURDATE() - NOW() |
+-------------------+
|   -20250805893581 |
+-------------------+
1 row in set (0.000 sec)

 

그래서 찾아봤더니, Mysql에는 원하는 단위로 시간 차이를 계산해주는 TIMESTAMPDIFF 라는 함수가 존재했다.. 매우 편리..!

SELECT 
	TIMESTAMPDIFF(SECOND, CURDATE(), NOW()) * 1000 
  	+ FLOOR(MICROSECOND(NOW(6)) / 1000) AS milliseconds_passed
;

 

[ 쿼리 설명 ]

연산 순서 :

TIMESTAMPDIFF(SECOND, CURDATE(), NOW()) * 1000

TIMESTAMPDIFF(SECOND, CURDATE(), NOW()) * 1000 

  • CURDATE() ↔ NOW() 간의 SECOND 단위 차이값 계산
  • 1초 = 1000밀리초 이므로 *(곱하기) 1000

 

FLOOR(MICROSECOND(NOW(6)) / 1000)

FLOOR(MICROSECOND(NOW(6)) / 1000)

  • NOW(6) 으로 마이크로초까지의 현재 시간을 구한다.
  • MICROSECOND() 함수로 now() 결과값으로부터 마이크로초를 가져온다.
  • 1밀리초 = 1000마이크로초 이므로 ÷(나누기) 1000을 해준다.
  • 나누기 연산은 소수점을 남기므로 소수점을 떼기 위해 FLOOR() 함수로 감싸준다.

 

 


 

+ 찾아보면서 알게 된 점.

NOW() -> 한번의 select 안에서는 시간 값이 고정됨.
SYSDATE() -> 한번의 select 안에서도 호출될때마다 시간값이 달라질 수 있음 (초단위가 달라질 수 있음)

 


참조글

https://bryan7.tistory.com/77

 

MySQL에서 millisecond 나 microsecond 단위로 저장하기

MySQL에서 SELECT NOW(); 를 해보면 초 단위까지 밖에 안 나온다. 그러나 SELECT NOW(3); 을 하면 millisecond 단위까지 나오고, SELECT NOW(6); 을 하면 microsecond 단위까지 현재 시간이 나온다. 테이블 생성할때 컬

bryan7.tistory.com

https://hoing.io/archives/13958

 

MySQL NOW()와 SYSDATE()의 차이

포스팅에서는 MySQL의 NOW 함수와 SYSDATE 함수의 차이에 대해서 설명하고 있습니다.

hoing.io

 

728x90
반응형

'database > mysql' 카테고리의 다른 글

Mysql과 MariaDB / RaspberryPI 에 MariaDB 설치하기  (1) 2025.08.26