AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

쿼리에 날짜/시간 함수 사용

이 가이드 에서는 하이버네이트 ORM용 MongoDB 확장을 사용하여 날짜/시간 필드 에서 하이버네이트 쿼리 언어(HQL) extract() 및 format() 함수를 호출하는 방법을 학습 수 있습니다. extract()를 사용하여 날짜/시간 값의 일부를 반환하고 format()를 사용하여 날짜/시간 값을 문자열로 렌더링할 수 있습니다.

하이버네이트 ORM 확장은 $project 단계에서 각 호출을 MongoDB 집계 표현식 으로 변환합니다. SELECT 절의 날짜/시간 필드 에서 두 함수를 호출할 수 있습니다.

참고

시간대

최대 절전 모드 ORM 확장은 애플리케이션 실행하는 JVM 의 기본값 구역 에서 각 날짜/시간 함수를 확인합니다. 생성된 연산자 의 timezone 인수로 해당 구역 MongoDB 에 전달합니다. 서로 다른 표준 시간대로 구성된 호스트에서 동일한 쿼리 서로 다른 값을 반환할 수 있습니다.

하이버네이트 ORM 확장은 계산된 표현식 의 피연산자로서의 함수 호출을 지원 하지 않기 때문에 날짜/시간 함수를 산술 연산자 와 결합할 수 없습니다. 자세히 학습 쿼리 지정 가이드 의 계산된 표현식 사용 섹션을 참조하세요.

이 가이드 의 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix.movies 컬렉션 나타내는 Movie 엔터티를 사용합니다. Movie 엔터티의 정의는 다음과 같습니다.

import com.mongodb.hibernate.annotations.ObjectIdGenerator;
import org.bson.types.ObjectId;
import java.time.Instant;
import java.util.List;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
@Entity
@Table(name = "movies")
public class Movie {
@Id
@ObjectIdGenerator
private ObjectId id;
private String title;
private String plot;
private int year;
private List<String> cast;
private List<String> directors;
private Instant released;
@Embedded
private Awards awards;
@OneToMany(mappedBy = "movie", fetch = FetchType.LAZY)
private List<Comment> comments;
public Movie(String title, String plot, int year, List<String> cast, List<String> directors, Instant released, Awards awards) {
this.title = title;
this.plot = plot;
this.year = year;
this.cast = cast;
this.directors = directors;
this.released = released;
this.awards = awards;
}
public Movie() {
}
public ObjectId getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPlot() {
return plot;
}
public void setPlot(String plot) {
this.plot = plot;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public List<String> getCast() {
return cast;
}
public void setCast(List<String> cast) {
this.cast = cast;
}
public List<String> getDirectors() {
return directors;
}
public void setDirectors(List<String> directors) {
this.directors = directors;
}
public Awards getAwards() {
return awards;
}
public void setAwards(Awards awards) {
this.awards = awards;
}
public Instant getReleased() {
return released;
}
public void setReleased(Instant released) {
this.released = released;
}
public List<Comment> getComments() {
return comments;
}
public void setComments(List<Comment> comments) {
this.comments = comments;
}
}

최대 절전 모드용 MongoDB 확장 ORM을 사용하여 이 MongoDB 샘플 컬렉션과 상호 작용하는 Java 애플리케이션 만드는 방법을 학습하려면 시작하기 튜토리얼을 참조하세요.

이 가이드 의 예시에서는 Instant 값을 저장하는 Movie 엔터티의 released 필드 사용합니다.

extract() 함수를 사용하여 날짜/시간 값의 특정 부분(예: 연도, 월, 일)을 반환할 수 있습니다.

extract(field from x) 함수는 날짜/시간 값의 단일 필드 반환합니다. 최대 절전 모드 ORM 확장은 field에 대해 다음 값을 지원합니다.

필드
MongoDB 번역

year

$year

quarter

$month를 3로 나누고 반올림하여 계산합니다.

month

$month

week

$isoWeek, ISO-8601 주 번호를 반환합니다.

week of year

$dayOfYear 및 $dayOfWeek에서 일요일 기반 주 번호로 계산됩니다.

week of month

$dayOfMonth 및 $dayOfWeek에서 일요일 기반 주 번호로 계산됩니다.

day, day of month

$dayOfMonth

day of week

$dayOfWeek

day of year

$dayOfYear

hour

$hour

minute

$minute

second

$second 및 $millisecond에서 소수점 이하 초 단위로 계산됩니다.

nanosecond

$second 및 $millisecond에서 계산

epoch

Unix epoch 이후의 전체 시간(초)으로 계산됩니다.

다음 예시 sample_mflix.movies 컬렉션 에 있는 각 "Hairspray" 영화의 제목과 영화가 개봉된 연도를 반환합니다.

var extractResult = session.createQuery(
"select title, extract(year from released) as releaseYear from Movie where title = :title",
Object[].class)
.setParameter("title", "Hairspray")
.getResultList();
for (var row : extractResult) {
System.out.println("Title: " + row[0] + ", Release Year: " + row[1]);
}
var extractResult = entityManager.createQuery(
"select m.title, extract(year from m.released) as releaseYear from Movie m where m.title = :title",
Object[].class)
.setParameter("title", "Hairspray")
.getResultList();
for (var row : extractResult) {
System.out.println("Title: " + row[0] + ", Release Year: " + row[1]);
}

최대 절전 모드 ORM 확장은 앞의 쿼리 다음 $project 단계로 변환하며, 여기서 America/New_York은 JVM 의 기본값 구역 입니다.

{
"$project": {
"title": true,
"releaseYear": {
"$year": {
"date": "$released",
"timezone": { "$literal": "America/New_York" }
}
},
"_id": 0
}
}

중요

요일 번호 매기기

day of week 필드 일요일의 1부터 토요일의 7까지의 일수를 계산한 MongoDB $dayOfWeek 값을 반환합니다. 이는 월요일의 1부터 일요일의 7까지 일수를 계산하는 Java DayOfWeek 열거형 과 다릅니다.

최대 절전 모드 ORM 확장은 date, time, offset, timezone_hour 및 timezone_minute 필드를 지원 하지 않습니다. 지원되지 않는 필드 추출하는 쿼리 FeatureNotSupportedException를 발생시킵니다.

format(x as pattern) 함수는 날짜/시간 값을 문자열로 렌더링합니다. 하이버네이트 ORM 확장은 MongoDB $dateToString 연산자 에 대한 호출을 변환하고 각 패턴 코드를 동등한 MongoDB 형식 지정자에 매핑합니다. 함수를 format(x, pattern)로 호출하고 MongoDB 형식 지정자를 직접 전달할 수도 있습니다.

최대 절전 모드 ORM 확장은 다음 패턴 코드를 지원합니다.

패턴 코드
설명
MongoDB 지정자

yyyy

네 자리 연도

%Y

YYYY

4자리 ISO-8601 주 기반 연도

%G

MM

두 자리 월

%m

MMM

축약된 월 이름

%b

MMMM

월 이름 전체

%B

ww

두 자리 ISO-8601 주 번호

%V

dd

해당 월의 두 자리 일

%d

DDD

연중무휴

%j

HH

24 시간 시계의 두 자리 시간

%H

mm

두 자리 분

%M

ss

두 자리 초

%S

SSS

세 자리 밀리초

%L

Z, ZZ, ZZZ, xx

UTC 오프셋

%z

MongoDB 미국 국가 및 언어 설정 으로 월과 일 이름을 반환합니다. 작은따옴표로 묶은 문자는 패턴 코드로 해석되지 않고 출력으로 전달됩니다.

다음 예시 각 "Hairspray" 영화의 제목과 출시하다 날짜를 yyyy-MM-dd 문자열로 반환합니다.

var formatResult = session.createQuery(
"select title, format(released as 'yyyy-MM-dd') as releaseDate from Movie where title = :title",
Object[].class)
.setParameter("title", "Hairspray")
.getResultList();
for (var row : formatResult) {
System.out.println("Title: " + row[0] + ", Release Date: " + row[1]);
}

대신 MongoDB 형식 지정자를 사용하려면 함수를 format(released, '%Y-%m-%d')(으)로 호출하면 됩니다.

var formatResult = entityManager.createQuery(
"select m.title, format(m.released as 'yyyy-MM-dd') as releaseDate from Movie m where m.title = :title",
Object[].class)
.setParameter("title", "Hairspray")
.getResultList();
for (var row : formatResult) {
System.out.println("Title: " + row[0] + ", Release Date: " + row[1]);
}

대신 MongoDB 형식 지정자를 사용하려면 함수를 format(m.released, '%Y-%m-%d')(으)로 호출하면 됩니다.

하이버네이트 ORM 확장은 앞의 쿼리 다음 $project 단계로 변환합니다.

{
"$project": {
"title": true,
"releaseDate": {
"$dateToString": {
"date": "$released",
"format": { "$literal": "%Y-%m-%d" },
"timezone": { "$literal": "America/New_York" }
}
},
"_id": 0
}
}

앞의 표 외부에 있는 패턴 코드를 사용하는 쿼리 FeatureNotSupportedException을 발생시킵니다. 여기에는 y, M , d, H, h, m, s, a와 같은 단일 문자 및 가변 너비 코드가 포함됩니다. 지정합니다. ZZZZZZZ와 같이 3자를 초과하는 반복되는 구역 코드는 모호하며 예외를 발생시킵니다.

쿼리 필터를 만들고 쿼리 문에서 연산자를 사용하는 방법에 대해 자세히 학습 보려면 쿼리 지정 가이드 를 참조하세요.

HQL 및 JPQL을 사용하여 쿼리를 실행 방법에 대해 자세히 학습하려면 하이버네이트 ORM 문서에서 하이버네이트 쿼리 언어 가이드 를 참조하세요.