어제, datetime에 대해서 잠깐 언급을 했었습니다. 어떻게 하면 두 시간의 차를 잘 계산할 수 있을까요? 예전에 time 함수를 이야기 할 때, 1970년 1월 1일 UTC+0일 때부터 현재까지 흐른 시간이 몇 초인지를 리턴해 준다고 했었습니다. mysql도 이와 동일한 일을 하는 함수가 있습니다.

 

 그 함수는 unix_timestamp입니다.

 

 


 사용 방법은 아래와 같습니다.

 

 

 인자로 Date나, Datetime과 같은 것을 넘겨주거나, 아니면 인자를 넘기지 않는 방법이 있습니다. 이 글에서 말하는 기준 시간은 1970년 1월 1일 0시 0분 0초 UTC+0인데요.

 

 

 제 timezone이 KST+9로 설정이 되어 있어요. 그러면, 실제로 UTC+0 시간대를 쓰는 지역에서는 1970년 1월 1일 0시 0분 5초일 겁니다. 기준 시로부터 5초가 차이납니다. 따라서 5가 리턴이 됩니다.

 

 

 그러면 이렇게 쓰면 어떤 값이 리턴이 될까요?

 

 

 쿼리를 실행했을 때 시간에서, 기준 시간 차이 값이 리턴이 됩니다. 대략 15.x억이 나오는 것을 보면 눈치를 채실 수 있습니다.

 

 


 그러면 YYYY-MM-DD hh:mm:ss 형식으로 표현되는 Datetime 둘의 차이를 어떻게 구해야 할까요? 간단합니다. 두 Datetime 필드를 각각 A, B라고 합시다. 그러면 unix_timestamp(A) - unix_timestamp(B)를 해 주면 될 거에요. 두 함수를 호출할 때, 기준 시간이 같기 때문에 가능한 것입니다.

 

 

 

 그러면, 이 쿼리의 실행 결과는 어떻게 나올까요?

 

 

 2초가 나옵니다. 2019-09-19 00:00:01은 기준 시간으로부터 x초가 흘렀다면, 2019-09-18 23:59:59는 기준 시간으로부터 x-2초가 흐른 것일 겁니다. x에서 x-2를 뺀 값은 2이기 때문에, 2를 출력합니다.

 

 

 도서관에서 borrow table을 생각해 봅시다. 빌린지 30일 이상 지난 대여 정보를 모두 출력하고자 합니다. 어떻게 하면 될까요? 현재 시간과, borrow_time의 차이가 24*60*60*30초 이상이라면, 30일이 지난 겁니다. 조건문만 이렇게 쓰면 됩니다.

 

 

 어제 그 문제 기억하실 겁니다. 분양이 된 동물 중에서, 보호소에 가장 오래 있었던 두 마리를 출력하라고 했었습니다. 이건 어떻게 하면 될까요? 쿼리의 5번째 줄만 바꾸면 됩니다. ANIMAL_OUTS.datetime - ANIMAL_INS.datetime에서, 어떻게 바꾸었나요? unix_timestamp(...) - unix_timestamp(...)로 바꾸었어요. 그러면 두 시간의 상대적인 차이를 제대로 계산할 수 있을 거에요.

 

 

 2038년 문제는 많이 들어보셨을 겁니다. time 함수의 리턴값이 int형인 경우에, 2038년 1월 20일이 기준 시간으로부터 몇 초만큼 흘렀는지를 리턴하지 못합니다. 이 경우도 그럴까요?

 

 

 특정한 시간을 주었습니다. 그랬더니 2147483647이 나왔습니다. 이 값은 4byte signed일 때, 표현할 수 있는 최댓값입니다.

 

 

 1초 더 뒤의 시간을 인자로 넘겨주겠습니다.

 

 

 그러면 0이 리턴됩니다. 2147483648은 4byte signed int형으로 표현하지 못하기 때문입니다.