예약하려고 하는 일자를 선택하면 해당 일시에 일정이 비어있는 펫시터를 조회하려고 한다. 단, 예약은 "일" 단위이기 때문에 하루 중 조금이라도 예약이 잡혀있다면 그 펫시터는 예약이 불가능하므로 펫시터 목록 조회에서 제외해야 한다.
where
절에서 NOT
을 사용하여 해당 '일시'에 예약이 잡혀있는 모든 펫시터들을 제외할 수 있었다. 그러나 일시가 함께 조회되므로 특정 시간을 제외한 모든 펫시터가 조회되는 문제가 있다.
findTrainersNoDate = async (date) => {
const noReservation = await this.prisma.trainers.findMany({
where: {
NOT: {
reservations: {
some: {
startDate: date,
},
},
},
},
select: {
trainerId: true,
users: { select: { name: true } },
petCategory: true,
price: true,
career: true,
},
});
return noReservation;
};
따라서, 시간을 고려하지 않고 특정 일자의 예약 정보를 모두 조회하려면 해당 일자의 시작과 끝을 포함하는 범위를 설정하여 검색해야 한다. 예를 들어, 특정 일자인 '2024-02-25'를 기준으로 00:00:00부터 23:59:59까지의 범위를 설정하여 해당 범위 내에 시작 날짜 또는 종료 날짜가 포함되는 예약 정보를 조회할 수 있다.
SQL에서는 다음과 같은 방법으로 쿼리를 작성할 수 있다:
SELECT *
FROM reservations
WHERE startDate <= '2024-02-25 23:59:59' AND endDate >= '2024-02-25 00:00:00';
위의 쿼리는 '2024-02-25'를 기준으로 시작 날짜가 해당 날짜보다 이전이고 종료 날짜가 해당 날짜보다 이후인 모든 예약 정보를 반환한다.
Prisma를 사용하는 경우에도 비슷한 방식으로 쿼리를 작성할 수 있다. 예를 들어:
const reservations = await prisma.reservations.findMany({
where: {
AND: [
{ startDate: { lte: '2024-02-25T23:59:59Z' } },
{ endDate: { gte: '2024-02-25T00:00:00Z' } }
]
}
});
위의 코드는 Prisma를 사용하여 시작 날짜가 '2024-02-25 23:59:59'보다 이전이고 종료 날짜가 '2024-02-25 00:00:00'보다 이후인 모든 예약 정보를 반환한다. 이렇게하면 시간을 고려하지 않고 해당 일자의 예약 정보를 모두 조회할 수 있다.
바디에서 일자를 선택할 때 시작일자와 종료일자를 받아와서 서비스 계층에서 시간을 위와 같이 가공하여 전달해주면 될 듯하다.