티스토리 뷰

728x90
반응형

mysql을 nodejs에서 사용할때는 가장 유명한패키지 2개가 있습니다

 

https://www.npmjs.com/package/mysql2

 

mysql2

fast mysql driver. Implements core protocol, prepared statements, ssl and compression in native JS. Latest version: 3.3.0, last published: 2 days ago. Start using mysql2 in your project by running `npm i mysql2`. There are 3602 other projects in the npm re

www.npmjs.com

https://www.npmjs.com/package/mysql2

 

mysql2

fast mysql driver. Implements core protocol, prepared statements, ssl and compression in native JS. Latest version: 3.3.0, last published: 2 days ago. Start using mysql2 in your project by running `npm i mysql2`. There are 3602 other projects in the npm re

www.npmjs.com

 

두개 모두 위클리 다운로드가 100만이상인 패키지 입니다

 

 

mysql에서 date를 나타내는 타입에는

 

  • date
  • datetime
  • timestamp

 

이렇게 3개가 있습니다

 

datetime과 timestamp는 시분초까지 나타내는 타입이고

 

date는 년월일 까지만 나타내는 타입입니다

 

datetime과 timestamp는 생성시각, 업데이트시각, 특정작업이 수행된 시각등을 넣는용도로 많이 사용되고

 

date 타입은 말그대로 어떤 날짜(년월일형태의)를 저장하려는 목적으로 사용됩니다

 

예로들면 생년월일이나, 시분초가 필요없는 날짜가 저장될때말이죠

 

 

그래서 datetime이나 timestamp는 order by나 between 같은 연산을 사용하는 경우가 많고

 

date는 단순 표시용이라던가 where의 단순 equal 조건으로서 사용되는 경우가 많은 것 같습니다

 

 

mysql, mysql2 모두

 

date, datetime, timestamp 컬럼의 값을 조회하는 경우

 

해당 컬럼의 값을 javascript의 date 오브젝트로 생성하여 리턴합니다

 

누가봐도 매우 합리적인 조치입니다

 

 

코드 내부를 살펴보면 위에 언급한 두개의 패키지 모두 date 타입을 다룰때 아래와 같은 방법으로 다루고 있습니다

 

// mysql2
let str = this.readDateTimeString(6, 'T');
if (str.length === 10) {
  str += 'T00:00:00';
}
return new Date(str + timezone);

 

// mysqljs
var originalString = dateString;
if (field.type === Types.DATE) {
  dateString += ' 00:00:00';
}

if (timeZone !== 'local') {
  dateString += ' ' + timeZone;
}

var dt = new Date(dateString);

 

두 방법이 유사하게 컬럼이 date 타입인경우 T00:00:00 이라는 string을 덧붙인 후에

 

timezone에 해당 하는 string을 또한번 덧붙입니다

 

 

그러니깐 여러분의 mysql 의 date type을 가진 컬럼이 있는 경우

 

해당 컬럼의 값이 2020-05-01 이라면

 

2020-05-01T00:00:00+09:00

 

이렇게 최종적으로 iso8601 형태의 string으로 완성되고 이 값이 new Date를 생성하는 매개변수로서 사용되는것입니다

 

 

자 이런 상황을 한번 가정해봅시다

 

여러분의 데이터 베이스는 kst를 기준으로 값이 저장되어있습니다

 

그리고 컬럼중에 birthday를 저장하는 date 타입의 컬럼이 있습니다

 

1990-01-01

 

이렇게 값이 입력되었을때 이사람의 생일은 말그대로 1990년 1월 1일생입니다

 

iso8601 형태로는

 

1990-01-01T00:00:00+09:00 이죠

 

UTC로는

 

1989-12-31T15:00:00+00:00 입니다

 

 

KST와 UTC를 볼때 두개가 같은 날짜와 시각을 가리키고 있지만 출력되는 년월일 표시가 전부 달라져버렸습니다

 

그래서 간혹 utc인것을 이해하지 못하고 코드상으로 년월일을 잘못계산하는 계산실수가 발생할수 있는 가능성이 있습니다

 

 

 

이 방법을 방지할수 있는 방법으로는 date컬럼을 date 타입으로 다루지 말고 string으로 다루는 방법이 있습니다

 

 

 

mysql connection을 생성할때 dateStrings 옵션을 활용할수 있습니다

 

var connection = mysql.createConnection({
  ...
  dateStrings: ['DATE']
});

 

참고로 대문자로 입력하셔야 합니다 (TIMESTAMP, DATETIME, DATE)

 

dateStrings 옵션이 있습니다

 

이 옵션은 boolean 또는 string형태로 사용하려는 타입이름을 가진 배열을 값으로 갖습니다 (boolean | string[])

 

기본값은 false이구요

 

 

이 값을 true로 설정하거나 또는 배열로 DATE 타입만 string으로 변경하려는 경우 ['DATE'] 이렇게 값을 지정하면

 

DATE에 해당하는 타입을 가진 컬럼의 값은 javascript의 date 타입이 아닌 string 타입으로 반환된답니다

 

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함