none
SQL Server GETDATE() 버그인것인지 문의 RRS feed

  • 질문

  • 안녕하세요, sql server를 사용하고 있는 개발자 입니다.

    sql server에서 이상한 증상이 발견되어, 혹시 버그는 아닌가 해서 문의 드립니다.

    여러 단계의 프로세스 중, 먼저 select한 getdate()보다 나중에 select한 getdate()가 더 과거의 값이 select되는 증상을 발견하였습니다.

    이를 테스트 하기 위해 별도의 쿼리를 작성하여 테스트를 해보니, 동일한 증상이 많이 나타납니다.

    혹시, 연속으로 getdate()를 여러번 진행할 경우에 그런 증상이 나타날 수 있는 것인지요?

    datetime형식의 경우 .000, .003 또는 .007초 단위로 반올림 되는 사항과 연관이 있나 싶었지만,

    그 문제는 아닌것 같고, 반올림 여부와 상관없이 오류가 있는 듯 합니다.

    실제 소스는 아래와 같은 패턴이며 테스트 쿼리는 따로 작성했습니다.

    실제 소스 패턴

    1. set @변수1 = getdate()

    2. 필요한 프로세스 처리

    3. set @변수2 = getdate()

    4. 필요한 프로세스 처리

    5. @변수1과 @변수2와 관련한 처리 시 오동작(if문이나 where문에서 사용)

    GETDATE()의 오동작 테스트 쿼리

    SET NOCOUNT ON;

    DECLARE @loopCount INT
    , @loopMaxCount INT
    , @beforeDatetime DATETIME
    , @currentDatetime DATETIME

    SET @loopCount = 1
    SET @loopMaxCount = 100000000
    SET @beforeDatetime = GETDATE()


    WHILE @loopCount <= @loopMaxCount
    BEGIN
    SET @currentDatetime = GETDATE()

    IF @beforeDatetime>@currentDatetime
    BEGIN
    SELECT @loopCount AS 'No', @beforeDatetime AS 'beforeDatetime', @currentDatetime AS 'currentDatetime'
    END

    SET @beforeDatetime = @currentDatetime

    SET @loopCount  = @loopCount + 1
    END

    증상은 2005, 2014에서 나타나는것을 확인했지만, 모든 버전에서 확인하기가 힘들기 때문에 문의 드립니다.

    또한, 위 쿼리로 테스트 시 증상이 무조건 나오는 것도 아니고 나왔다 안나왔다 혹은 조금 나왔다 많이 나왔다 합니다.

    위 증상에 대해서 확인이 가능했으면 좋겠습니다.


    • 편집됨 김기회 2015년 12월 4일 금요일 오전 9:32
    2015년 11월 27일 금요일 오전 12:42

모든 응답

  • 오~ 특이하군요.

    2012에서도 동일한 결과가 나옵니다.

    음... 제가 버그라고 판단해버릴 수는 없지만... 시간이 중요한 문제라면 아래 방법으로 수정해보시면 어떨까 싶습니다.

    getdate()대신 sysdatetime()을 변경하고 테스트하면 위와 같은 문제가 재현되지는 않습니다.

    단, sysdatetime()는 SQL 2008 이상부터 사용가능하니까 2005를 사용해야 하는 경우라면 해결책이 될수는 없겠네요.

    sysdatetime

    도움이 되셨으면 합니다.

     

    Younggun Kim

    MCDBA, MCITP
    Consultant @ Database Division in SQLRoad
    http://www.sqlroad.com  http://www.sqlserver.co.kr
    ygkim@sqlroad.com

    • 답변으로 표시됨 김기회 2015년 12월 4일 금요일 오전 1:00
    • 답변으로 표시 취소됨 김기회 2015년 12월 4일 금요일 오전 1:00
    2015년 12월 3일 목요일 오전 4:32
  • 직접 해보시고 댓글 달아주신것 감사합니다.

    저도 sysdatetime으로 해결 가능하다라는 것은 알고 있습니다.

    다만, getdate()에서 나타나는 현상이 버그인 것인지 아니면 당연(?)한 것인지가 궁금한 것입니다. ^^;

    위 테스트 쿼리에 sysdatetime까지 포함해서 테스트 해보니 sysdatetime은 그러한 현상이 나타지 않고

    sysdatetime의 시간이 동일한데 getdate에서 오차가 발생하는 것을 알 수 있었습니다.

    단순히 반올림 문제라면, getdate에서 제일 끝자리만 달라야 하는데 그보다 큰 차이가 발생하는 경우도 있더군요...

    그래서 글을 남겨보았습니다.....이거....어떻게...답을 얻을 수 있는 방법은 없을런지요?

    다시한번 감사 드립니다.

    2015년 12월 4일 금요일 오전 1:02