문제 : NodeJS로 구성된 API서버에서 입력한 시간을 MSSQL 서버에 입력 시 간혹 1 밀리세컨드 차이가 발생함.

원인 : NodeJS에서 MSSQL로 쿼리 생성 후 전달 시 매개변수 타입을 의도와 다르게 DateTime 으로 설정함.

해결 : MSSQL 컬럼 타입과 매개변수 타입을 DateTime2로 변경.

 

상세 내용:

의도

데이터 입력 시간을 밀리세컨드 까지 기록하려 함. [예시) 2025-01-01 13:01:00.001]

API서버는 NodeJs로 구성되어 있고, mssql 라이브러리를 require 로 가져와서 사용함.

const msdb = require('mssql');

async dbtest() {
        let now = new Date();
        console.log(now); //2025-01-01 13:01:00.001
        return (await msdb.connect(conf.db)).request()
            .input('RMK', msdb.NVarChar, 'Test Remark')
            .input('REG_DT', msdb.DateTime, now)
            .query(`insert into tb_logs (RMK, REG_DT) values (@RMK, @REG_DT)`);
    }

 

문제 확인

MSSQL DB에서 Select 쿼리로 조회해보면, 간혹 한번씩 1밀리세컨드가 더 크게 들어가 있는 것을 확인함.

console.log로 찍은건 밀리세컨드가 001 인데 MSSQL 서버에서 002로 조회됨.

MSSQL 컬럼 타입을 DateTime2로 변경해서 테스트한 후 문제 원인 추측할 수 있었음.

console.log에서 [2025-01-01 13:01:00.001] 이렇게 보이던 값이

DB에 [2025-01-01 13:01:00.0016667] 과 같이 들어가 있었고, 조회될 때 4번째에서 반올림되어 002로 조회되었음.

 

문제 해결
MSSQL 컬럼 타입과 Node.js API서버의 매개변수 타입을 msdb.DateTime2로 변경해준 뒤 

DB에 [2025-01-01 13:01:00.0010000] 으로 저장됨 확인.

const msdb = require('mssql');

async dbtest() {
        let now = new Date();
        console.log(now); //2025-01-01 13:01:00.001
        return (await msdb.connect(conf.db)).request()
            .input('RMK', msdb.NVarChar, 'Test Remark')
            .input('REG_DT', msdb.DateTime2, now) //msdb.DateTime -> msdb.DateTime2
            .query(`insert into tb_logs (RMK, REG_DT) values (@RMK, @REG_DT)`);
    }

 

-- 위 코드는 상황을 설명하기 위해 재구성하여 작성하였기에 정상적으로 동작하지 않을 수 있습니다.

 

-- 개인적인 생각. 

공식 문서에는 DateTime2가 0.0000001 초까지 기록된다고 되어있는데, node의 mssql 라이브러리 버그인걸까?

mssql은 7.3.5 버전을 사용중...

+ Recent posts