AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.

$dateDiff (표현식 연산자)

$dateDiff

버전 5.0의 신규 항목입니다.

두 날짜의 차이를 반환합니다.

$dateDiff 표현식의 구문은 다음과 같습니다.

{ $dateDiff: { startDate: <Expression>, endDate: <Expression>, unit: <Expression>, timezone: <tzExpression>, startOfWeek: <String> }}

$dateDiff 은 timezone 내에서 startDate 부터 endDate 까지 교차하는 시간 간격의 상한을 계산하여 차이를 계산합니다. 시간 간격의 길이는 unit 1개와 같으며, 해당 경계가 시간 축을 따라 unit 의 정수 배수에 있도록 정렬됩니다. 경계를 넘지 않는 부분 단위는 제외됩니다. 이 표현식 지정된 unit로 된 정수를 반환합니다. endDate 이 startDate 앞에 오면 음의 정수를 반환합니다.

필드
필수/선택 사항
설명

startDate

필수 사항

기간의 시작. startDate는 날짜, 타임스탬프, 객체 ID로 확인되는 모든 표현식이 될 수 있습니다.

endDate

필수 사항

기간의 끝. endDate는 Date, Timestamp, ObjectID로 해석되는 모든 표현식이 될 수 있습니다.

unit

필수 사항

startDate와 endDate 간의 시간 측정 unit. 다음과 같은 문자열로 리졸브되는 표현식입니다.

  • year

  • quarter

  • week

  • month

  • day

  • hour

  • minute

  • second

  • millisecond

timezone

옵션

작업을 수행할 표준 시간대입니다. 은 Olson 표준 시간대 식별자 <tzExpression> 또는 UTC 오프셋 형식의 string으로 확인되는 유효한 표현식 이어야 합니다.

  • Olson 타임존 식별자: 예시: "America/New_York", "Europe/London", "GMT"

  • UTC 오프셋: 예시: "+04:45", "-0530", "+03"

timezone을 생략하면 결과가 UTC에 표시됩니다.

startOfWeek

옵션

단위가 week와(과) 같을 때 사용됩니다. 기본값은 Sunday입니다. startOfWeek 매개 변수는 대소문자를 구분하지 않는 문자열로 확인되는 표현식입니다.

  • monday (또는 mon)

  • tuesday (또는 tue)

  • wednesday (또는 wed)

  • thursday (또는 thu)

  • friday (또는 fri)

  • saturday (또는 sat)

  • sunday (또는 sun)

$dateDiff 표현식은 각 데이트의 특정 부분을 비교하여 정수를 반환합니다. year 단위의 경우 년도 값을 비교합니다. 2022 의 모든 데이트는 2023의 모든 데이트와 year 단위로 떨어져 있습니다. week 단위의 경우 주 번호를 비교합니다. 5 주의 모든 데이트는 6주의 모든 데이트와 week 단위로 떨어져 있습니다.

$dateDiff startDate과 endDate 사이에서 건너는 단위 경계의 수를 세어립니다. 경과 시간은 측정하지 않습니다. 예를 들어, $dateDiff는 2022 년 31월 year 일과 2023년 1월 일 사이의 차이를 하나로 보고합니다. 두 날짜 사이에 몇 시간이 지났지만 연도 경계가 거치지답니다. 전체 예시는 년 경계 건너는 중을 참조하세요.

week 의 시작은 startOfWeek 매개변수에 의해 수정되지 않는 한 Sunday 입니다. $dateDiff 은 지정된 날의 startDate 와 endDate 사이에 시작되는 모든 주를 계산합니다. 주 수는 캘린더 month 또는 캘린더 year에 의해 제한되지 않습니다.

<timezone> 필드에서 Olson 표준 시간대 ID를 사용할 때 MongoDB는 지정된 시간대에 적용 가능한 경우 DST 오프셋을 적용합니다.

예를 들어 sales 다음 문서가 있는 컬렉션을 생각해 보겠습니다.

db.sales.insertOne( { "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:15:39.736Z") })

다음 집계는 MongoDB가 Olson 시간대 식별자에 대한 DST 오프셋을 처리하는 방법을 보여 줍니다. 이 예시에서는 $hour 및 $minute 연산자를 사용하여 date 필드의 해당 부분을 반환합니다.

db.sales.aggregate([{ $project: { "nycHour": { $hour: { date: "$date", timezone: "-05:00" } }, "nycMinute": { $minute: { date: "$date", timezone: "-05:00" } }, "gmtHour": { $hour: { date: "$date", timezone: "GMT" } }, "gmtMinute": { $minute: { date: "$date", timezone: "GMT" } }, "nycOlsonHour": { $hour: { date: "$date", timezone: "America/New_York" } }, "nycOlsonMinute": { $minute: { date: "$date", timezone: "America/New_York" } } }}])

이 연산은 다음과 같은 결과를 반환합니다.

{ "_id": 1, "nycHour" : 5, "nycMinute" : 24, "gmtHour" : 10, "gmtMinute" : 24, "nycOlsonHour" : 6, "nycOlsonMinute" : 24}

이 알고리즘은 그레고리력을 사용하여 날짜 차이를 계산합니다.

윤년과 일광 절약 시간은 고려되지만 윤초는 고려되지 않습니다.

반환되는 차이는 음수일 수 있습니다.

고객 주문 컬렉션을 생성합니다.

db.orders.insertMany( [ { custId: 456, purchased: ISODate("2020-12-31"), delivered: ISODate("2021-01-05") }, { custId: 457, purchased: ISODate("2021-02-28"), delivered: ISODate("2021-03-07") }, { custId: 458, purchased: ISODate("2021-02-16"), delivered: ISODate("2021-02-18") } ])

다음 예제입니다.

  • 배송에 소요된 평균 일수를 반환합니다.

  • dateDiff를 사용하여 purchased 날짜와 delivered 날짜 사이의 기간을 계산합니다.

db.orders.aggregate( [ { $group: { _id: null, averageTime: { $avg: { $dateDiff: { startDate: "$purchased", endDate: "$delivered", unit: "day" } } } } }, { $project: { _id: 0, numDays: { $trunc: [ "$averageTime", 1 ] } } } ])

$group 단계의 $avg 축적자는 각 문서의 $dateDiff를 사용하여 purchased 날짜와 delivered 날짜 사이에 있는 시간을 가져옵니다. 결과 값은 averageTime으로 반환됩니다.

averageTime의 소수 부분은 $project 단계에서 잘려($trunc) 다음과 같은 출력을 생성합니다.

{ "numDays" : 4.6 }

구독의 시작 날짜와 종료 날짜를 사용하여 이 컬렉션을 만듭니다.

db.subscriptions.insertMany( [ { custId: 456, start: ISODate("2010-01-01"), end: ISODate("2011-01-01") }, { custId: 457, start: ISODate("2010-01-01"), end: ISODate("2011-06-31") }, { custId: 458, start: ISODate("2010-03-01"), end: ISODate("2010-04-30") } ])

$dateDiff 표현식은 units로 표현된 시간 차이를 정수로 반환합니다. 단위에는 분수가 존재하지 않습니다. 예를 들어, years로 계산할 경우, 반년 값이 존재하지 않습니다.

이 예시에서는 unit을 변경하면 반환되는 정밀도가 어떻게 달라지는지 확인합니다.

db.subscriptions.aggregate( [ { $project: { Start: "$start", End: "$end", years: { $dateDiff: { startDate: "$start", endDate: "$end", unit: "year" } }, months: { $dateDiff: { startDate: "$start", endDate: "$end", unit: "month" } }, days: { $dateDiff: { startDate: "$start", endDate: "$end", unit: "day" } }, _id: 0 } } ] )

결과는 이 표에 요약되어 있습니다.

시작하기
End
년
개월
일

2010-01-01

2011-01-01

1

12

365

2010-01-01

2011-07-01

1

18

546

2010-03-01

2010-04-30

0

1

60

두 번째 행에서 2010-01-01 와 2011-07-01 는 다른 연도(2010 과 2011)에 있으므로 $dateDiff 은 1 year을 반환합니다. 세 번째 행에서 2010-03-01 (삼월)와 2010-04-30 (사월)는 한 달 차이가 나므로 $dateDiff 은 1 month를 반환합니다.

몇 시간 만큼 차이가 나지만 연도 경계를 기준으로 양쪽에 있는 두 개의 날짜를 포함하는 컬렉션을 만듭니다.

db.events.insertOne( { start: ISODate("2022-12-31T20:00:00Z"), end: ISODate("2023-01-01T02:00:00Z") })

year 단위를 사용하여 $dateDiff을 사용하여 두 날짜 간의 차이를 찾습니다.

db.events.aggregate( [ { $project: { _id: 0, yearsApart: { $dateDiff: { startDate: "$start", endDate: "$end", unit: "year" } } } } ])

이 연산은 다음과 같은 결과를 반환합니다.

{ "yearsApart" : 1 }

두 날짜 사이에 6시간만 지났지만 날짜가 다른 연도에 속하므로 $dateDiff은 1을 반환합니다. 이는 $dateDiff가 경과 시간이 아니라 건너난 단위 경계를 계산한다는 사실을 반영합니다.

월 컬렉션을 생성합니다.

db.months.insertMany( [ { month: "January", start: ISODate("2021-01-01"), end: ISODate("2021-01-31") }, { month: "February", start: ISODate("2021-02-01"), end: ISODate("2021-02-28") }, { month: "March", start: ISODate("2021-03-01"), end: ISODate("2021-03-31") }, ] )

다음 코드를 사용해 각 주의 시작을 변경하고 이를 반영한 각 월의 주 수를 계산할 수 있습니다.

db.months.aggregate( [ { $project: { wks_default: { $dateDiff: { startDate: "$start", endDate: "$end", unit: "week" } }, wks_monday: { $dateDiff: { startDate: "$start", endDate: "$end", unit: "week", startOfWeek: "Monday" } }, wks_friday: { $dateDiff: { startDate: "$start", endDate: "$end", unit: "week", startOfWeek: "fri" } }, _id: 0 } } ] )

결과는 이 표에 요약되어 있습니다.

월
Sunday
Monday
Friday

1월

5

4

4

2월

4

3

4

3월

4

4

4

결과에서 다음을 확인할 수 있습니다.

  • startOfWeek가 일요일인 경우 2021년 1월의 다섯 번째 week는 31일에 시작됩니다.

  • 31일이 일요일이고 startDate에서 endDate 사이이므로 계산에 week이 하나 추가됩니다.

  • endDate 이후 또는 다음 달력 기간에 해당 주가 끝나는 경우에도 week 개수가 증가합니다.

이 페이지 평가하기

이 페이지의 내용