DB의 EmploymentRate 테이블에서 날짜 데이터 date(YYYY-MM-DD)을 통해 특정 레코드를 조회하려고 했다.
문제상황
날짜 데이터를 입력해도 원하는 날짜의 데이터를 조회할 수 없었다.
원인
Sequelize의 쿼리문이 SQL 쿼리문으로 바뀌는 과정에서 날짜 데이터가 바뀌는 것을 확인했다.
DB에서 조회할 레코드의 date 값은 '2022-01-19 00:00:00' 으로 저장되어 있다.
그래서 Sequelize 문법에서 조건문에 '2022-01-19'를 입력했다.
그러나 SQL 쿼리문에는 '2022-01-18 15:00:00'이 입력되어 있었다.
// Sequelize를 통한 쿼리문
const { EmploymentRate } = require('../../models')
EmploymentRate.findAll({
where:{
date: '2022-01-19'
}
})
# SQL 쿼리문
Executing (default):
SELECT `id`, `date`, `value`, `createdAt`, `updatedAt`
FROM `EmploymentRates` AS `EmploymentRate`
WHERE `EmploymentRate`.`date` = '2022-01-18 15:00:00'
문제 해결 코드
방법1 (between)
Sequelize 문법에서 between operator를 사용하여 해결했다.
조건문에 '2022-01-19 00:00:00' 와 '2022-01-20 00:00:00' 사이값을 조회하면,
SQL 쿼리문은 '2022-01-18 15:00:00' 와 '2022-01-19 15:00:00' 사이 값을 조회하게 된다.
그러면 원하는 '2022-01-19 00:00:00' 데이터를 조회할 수 있다.
between을 사용할 경우 작은 값이 앞에, 큰 값이 뒤에 와야 한다.
조건문에 '2022-01-20 00:00:00' AND '2022-01-19 00:00:00' 를 입력해야 안 된다.
대신 '2022-01-19 00:00:00' AND '2022-01-20 00:00:00' 를 입력해야 한다.
// Sequelize를 통한 쿼리문
const { EmploymentRate } = require('../../models')
const { Op } = require("sequelize");
EmploymentRate.findAll({
where:{
date: {
[Op.between]: ['2022-01-19', '2022-01-20']
}
}
})
방법2
가능하다면 date 필드 대신 다른 필드의 값을 입력하는 것이 좋다.
이 경우 DB 데이터가 날짜순으로 정렬되이 있기 때문에, id 값으로 원하는 레코드를 조회할 수 있었다.
// Sequelize를 통한 쿼리문
const { EmploymentRate } = require('../../models')
// DB의 마지막 id를 조회
const lastId = await EmploymentRate.max('id')
EmploymentRate.findAll({
where:{
id: lastId
}
})
'프로그래밍 > 웹 개발' 카테고리의 다른 글
[Webpack] SPA 구현 시 새로고침 후 404 에러 (라우팅 에러) (0) | 2022.01.27 |
---|---|
[Heroku] Node.js 서버 및 DB 무료 배포/호스팅 (MySQL & Sequelize) (0) | 2022.01.19 |
[chart.js] x축 날짜 데이터 형식 설정 (date) (2) | 2022.01.19 |
[Chart.js] 차트 축의 최소/최대값 설정하기 (0) | 2022.01.19 |
[바닐라 JavaScript] 화면 전환과 리렌더링 (에러핸들링) (0) | 2022.01.18 |
댓글