본문 바로가기
프로그래밍/웹 개발

[MySQL & Sequelize] 날짜(date)로 DB 데이터 조회 (에러핸들링)

by 제이콥J 2022. 1. 19.

DB의 EmploymentRate 테이블에서 날짜 데이터 date(YYYY-MM-DD)을 통해 특정 레코드를 조회하려고 했다.

 

EmploymentRate 테이블

 

문제상황

날짜 데이터를 입력해도 원하는 날짜의 데이터를 조회할 수 없었다.

 

원인

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
  }
})

 

반응형

댓글