초보 님이 쓰신 글 :
: 계속 이상한 일이 벌어지고 있습니다.
:
: ㅠ.ㅠ
:
: 그런 현상은 계속 발생되고 있구요. 오늘 한가지 더 이상한 점을 발견했습니다.
:
: 제가 잘 몰라서 그런건지는 모르겠지만, 클라이언트에서 데이터를 저장할때
:
: INSERT INTO TABLE_NAME (..., SAVETIME) VALUES (..., 'NOW');
:
: 이런식으로 쿼리문을 날립니다.
:
: 오늘 잠깐 서버를 들여단 본 결과를 보자면 이 SAVETIME 이라는 필드에 '2009-02-06'일이 저장이 되었다는겁니다.
:
: 제가 마지막으로 데이터 보정 봐 준것이 '2009-02-15'일 인데요
:
: 분명이 그 이후에 저장된 데이터의 날짜에 버젓이 훨씬 오래전 날짜가 저장이 되었다는 겁니다.
:
: 'NOW'가 서버의 시간을 가져다가 저장하는것 맞죠?
:
: 당근 SAVETIME 필드는 TIMESTAMP로 정의되어 있습니다.
:
: 제가 뭘 잘못 한걸까요?
:
: 참고로 서버는 IBM으로 x3500, CPU는 xeon E5430 Quad Core 2.66GHz
:
: 이렇게 구성되어 있습니다.
안녕하세요. 까막입니다.
일단 DB 는 Firebird 라는 가정하에.
위 Now 는 델파이 코드 내에서 날짜를 가져오는 거지, Firebird DB 에서 먹히는 문장은 아닙니다.
Firebird 에서는 CURRENT_DATE, CURRENT_TIMESTAMP 등을 쓰죠.
그러니, 델파이에서 날짜 데이터를 추출해서 SaveTime 이라는 필드값으로 넣어주는 형식이겠죠.
이 경우, 프로그램을 실행하는 컴퓨터의 날짜를 가져오게 됩니다.
실행 컴퓨터의 날짜가 어떤 이유에서건 예전 날짜로 되어 있었다면 그 날짜값으로 입력을 하게되는 거죠.
물론 위에서 CURRENT_DATE, CURRENT_TIMESTAMP 를 쓴다고 해도 서버컴의 날짜가 잘못 되어 있으면 잘못된 날짜가 들어가겠죠.
SaveTime 필드 속성에 Default 로 CURRENT_TIMESTAMP 설정을 하고요.
입력 처리시에 SaveTime 필드는 아예 빼버리세요.
오류를 최대한 막는 길입니다.
참, NOT NULL 설정도 하시는게 좋겠죠.
서버 날짜가 잘못 변경되는 일이 없으시도록 관리도 하셔야 할거고요.
설계시에 이런 부분을 빼먹지 않도록 유의하시는게 좋겠죠.
위대한 단군혼이 살아있는 나라.... 대한민국.
|