mysql datetime형 : 어떤 타입일까?

코딩/Sql 2019. 9. 19. 21:49

 mysql에서, 시간을 다루는 데이터 형도 꽤 많습니다. 프로그래머스에, 이런 문제가 나왔었습니다. 테이블 2개가 주어집니다. 입양을 간 동물에 대한 Table이 주어지고, 보호소에 온 동물들에 대한 Table이 주어집니다. 그런데 오늘 제가 날짜에 대해서 합니다. 그러면. 대충 어떤 쿼리가 들어왔는지 감이 오시나요?

 

 datetime이 어떤 형인지 봅시다.

 

 


  먼저, 아래 쿼리를 생각해 봅시다.

 

 '2019-09-19  00:00:00'이라는 데이터는 varchar형입니다. 문자열입니다. 저는 이것을 datetime 형으로 변환을 할 건데요. 이를 위해서 cast 함수를 씁니다.

 

 

 그러면, 이 값이 datetime으로 들어갔을 건데요. Binary가 어떻게 들어갔는지 봅시다.

 

 

 헥사로 32, 30, 31, 39. 일단 아스키 코드로 48번이 '0'입니다. 49번이 '1', 50번이 '2'입니다. 즉, '2019-09-19 00:00:00'이 문자열 같이 들어갔다는 소리가 됩니다. 

 

 

 이것은 아스키 코드를 뜯어봐도 알 수 있는 부분입니다. 기본 형식은 YYYY-MM-DD hh:mm:ss이고, 1000년 1월 1일 0시 0분 0분부터 9999년 12월 31일 23시 59분 59초까지 저장할 수 있습니다.

 

 


 프로그래머스에 나온 모 문제를 생각해 봅시다. 저는 입양이 된 동물등 중에서, 가장 오랫동안 보호소에 있었던 동물 2마리를 이름과 함께 출력해야 합니다.

 

 

 저는 쿼리를 위와 같이 작성하였습니다. 보시면, 자연 조인을 먼저 했어요. 그리고, 무엇을 기준으로 정렬했나요? time을 기준으로 내림차순으로 깔았습니다. 그러면, 이 time은 어떻게 구하나요? ANIMAL_OUTS의 DATETIME에서, ANIMAL_INS의 필드 DATETIME을 뺐습니다. 이 둘은 datetime 형이고요.

 

 이 쿼리는 올바른 결과를 리턴할까요?

 

 

 이런 쿼리를 생각해 봅시다. 보시면 2019-09-19 00:01:15에서 2019-09-19 00:00:01을 빼고 있어요. 결과값을 볼까요?

 

 

 114가 나옵니다. 이는 20190919000115에서 20190919000001을 뺀 값과 같음을 알 수 있어요. 정말 그런지 한 가지 실험을 더 해 봅시다.

 

 

 2019년 9월 19일 2시 2분에서, 2019년 9월 9일 1시 59분을 빼 봅시다. 제대로 계산했다면 3분이 나와야 합니다.

 

 

 그런데 4300이 나옵니다. 왜 그럴까요? 20190919020200에서 20190919015900을 빼면 4300이기 때문입니다.

 

 


 그러면 결론적으로 단순히 datetime의 두 값을 빼는 것 만으로 제대로 비교할 수 있을까요? 흐른 시간을? 아닙니다. 이 두 예에서 잘 보여주었습니다. 그러면, 두 테이블을 자연 조인했을 때, ANIMAL_OUTS의 필드 DATETIME에서, ANIMAL_INS의 필드 DATETIME을 뺀 값이 클 수록, 시간이 오래 흐른 것일까요?

 

 

 아닙니다. 이는 제가 보여드린 예를 통해서도 알 수 있었습니다. 더 극단적인 예를 들어보겠습니다.

 

 

 이 쿼리를 실행해 보겠습니다. 그러면 결과가 어떻게 나올까요?

 

 

 1번째는 764042가 나옵니다. 이는 20190919000001에서 20190918235959를 뺀 값이 764042이기 때문입니다. 그리고 diff2는 15가 나옵니다. 1번째의 시간차는 단 2초에 불과합니다. 2번째는 15초입니다. 하지만, datetime의 두 값을 빼 보니, 1번째 경우가 훨씬 더 크게 나왔습니다.

 

 따라서, difftime 둘을 뺀 값으로 시간을 체크하는 방법은 올바른 방법이 아닙니다. 어떻게 체크하는지는 다음 시간에 언급하도록 하겠습니다.