mysql에서 sysdate()와 now()는 현재 날짜와 시간을 리턴해 주는 함수입니다. 예를 들어서 도서관 데이터 베이스가 있다고 합시다. 어떠한 사람이 어떤 책을 빌려갔는지, 언제 빌려갔는지 등을 테이블에 저장할 거에요. 보통, 30일 정도 지나면 연체인데요. 이 때, 현재 시간이, 빌린 날로부터 30일 이상 경과되었다면 연체로 처리하면 될 거에요. 그럴 때, 보통 두 함수를 써요. 현재 시간과 날짜를 알아와야 할 때. 물론, 여기서 데이터를 더 잘 조작해야 겠지만요. 이 두 함수는 하는 일은 같지만, 차이가 있는데요. 이 부분에 대해서, 알아보도록 하겠습니다.

 

 


 먼저 sysdate() 부터 봅시다. 다음 쿼리를 작성해 봅시다.

 

 

 sysdate() 함수 사이에, sleep 함수를 호출했는데요. 대충 10초 정도 텀을 두었습니다.

 

 

 그랬더니, 요렇게 출력이 되었는데요. 1열과 3열의 출력 결과가 다르게 나타났음을 알 수 있어요.

 

 

 Output을 보시면 #2가 18:44:37에 실행이 되었습니다. 이 시점에서, sysdate()가 불렸을 겁니다. 즉, 1번째 열에 출력되는 값은 그 18시 44분 37초였습니다. 그리고 sleep(10)이 call 되었는데요. 이 때 10초 동안의 시간이 흐릅니다. 10초 동안의 시간이 흐르면 18시 44분 47초일 겁니다.

 

 그리고 나서, 다시 sysdate를 호출했는데요. 호출된 시점이 18시 44분 47초이므로 18:44:47이 출력이 됩니다.

 

 

 예제 2를 봅시다. 이번에는 sleep을 호출하고, sysdate를 호출하는 작업을 2번 하였습니다. 이 때는 어떤 값이 출력이 될까요? 천천히 봅시다.

 

 

 

 일단, 이 쿼리가 수행되기 시작한 시점은 18:51:37이였습니다. 먼저 10초 동안 sleep 하였습니다. 그러면, 18:51:47가 되었습니다. 이 때, 문제의 함수가 호출이 됩니다. 다음에, 다시 10초 동안 또 sleep을 하는데, 그러면 또 10초가 흘렀을 겁니다. 따라서 18:51:57이 되는데, 이 시점에 문제의 함수가 2번째로 호출이 됩니다.

 

 따라서, 18:51:47이 2번째 열에, 18:51:57이 4번째 열에 호출이 됩니다.

 

 

 즉, statement가 시작한 시간이 아니라, 함수를 언제 불렀는지, 즉 호출 시점이 중요합니다.

 

 


 now()는 다릅니다. 예제 3번을 봅시다.

 

 

 now 사이에 sleep를 두었습니다. 이 경우에도 마찬가지로, now가 10초 정도의 텀을 두고 2번 호출이 될 겁니다.

 

 

 이 쿼리의 실행 시작 시간이 18:49:41입니다. 1번째 now가 호출된 시점은 18:44:37이고, 2번째 문제의 function이 call 된 시간은 18:49:51입니다. 어떻게 출력이 되는지 볼까요?

 

 

 1열과 3열의 결과값이 18:49:41이였습니다. statement가 실행된 시간을 리턴합니다. 또 다른 예제를 보겠습니다.

 

 

 이번에는 sleep 10초를 먼저 수행한 다음에, now를 실행합니다. 이것을 2번 반복했습니다.

 

 

 이 쿼리의 실행 시작 시간은 18:53:22였습니다. 어떻게 출력될까요? 일단 1번째 now 함수가 호출된 시점은 18:53:32일 거고요. 2번째 now가 call 된 시점은 18:53:42일 겁니다.

 

 

 하지만, 이 두 값이 출력되지 않고, 18:53:22가 출력되었습니다. 쿼리가 시작된 시점이 18:53:22였기 때문입니다. 정리해 봅시다. mysql의 sysdate는 함수가 호출된 시점이 중요했습니다. 즉, 하나의 쿼리에서, sysdate가 call 되고 10초 후에 다시 또 sysdate가 호출이 된다면 실행 결과값이 다르게 나타납니다. 하지만, now는 그렇지 않다는 것을 정리하시면 좋을 듯 싶습니다.