Mysql 그날의 끝 시간(23:59:59) 저장 시 주의 할 점

less than 1 minute read

살다보면 특정 일의 첫시간,끝시간을 구하고 저장할 일이 있다.(개발자로 살다보면..)

java8 이후부턴가? 나온 localDateTime 을 이용해서 구하면 다음과 같다

public static Timestamp getEndOfDay(Timestamp t) {
		LocalDateTime dateTime = new LocalDateTime(t);
		// 한날의 최후시간인 23시 59분 59.999 초로 세팅하면 DB 에 저장하는 순간 그 다음날 0시0분0초 000 으로 바뀐다.
		// 날짜가 바뀌게 되어서 엉망진창이 될 수 있으니 조심하자. 1초를 빼줄 필요가 있다
		dateTime = dateTime.millisOfDay().withMaximumValue().minusSeconds(1);
		return new Timestamp(dateTime.toDateTime().getMillis());
	}

문제는 저 minusSeconds 부분인데 저걸 굳이 넣어준 이유는 다음과 같다.

한날의 최후시간인 23시 59분 59.999 초로 세팅하면 DB 에 저장하는 순간 그 다음날 0시0분0초 000 으로 바뀐다.

일전에 클라이언트에서 어떤 상품의 판매기간 세팅시 사용했던 캘린더 라이브러리가, 그 날의 끝을 던질때 23:59:59.999 값으로 던졌었는데, 자꾸 판매 일시로 뽑으니 그 다음날로 나오길래 어떤 오류인가 봤더니 어플리케이션 단에서만 해도 저 값이던 날짜가 DB 에 저장되니 다음날로 바뀌어버렸다.

찾아보니 MsSQL 같은 경우는 아래와 같은 룰이 있다더라

MySql 은… 귀찮아서 찾아보진 않았지만 어쨌든 squelPro 를 이용해 mysql 에 시간값 뒤에 소수점을 넣어줬더니… 그냥 1초 늘려 버린다. mysql 고유 룰인지 잘 모르겠지만 어쨌든 999 는 위험하다.

클라이언트에서 혹시 하루의 끝값을 받을 일이 있다면, 넘겨줄때도 .999는 안붙게 하길, 그리고 서버에서 핸들링할때도 끝날짜로 넣어줄땐 꼭 .999 가 붙지 않았나 확인해주자.

(mysql 설정으로 이 기본값을 고칠 수 있는 법을 아신다면 알려주세요)

Categories:

Updated: