Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 타임스탬프 차이를 시간 단위로 계산하는 방법

MongoDB에서 두 날짜(타임스탬프) 사이의 차이를 시간 단위로 계산하려면 애그리게이션 프레임워크(Aggregation Framework)를 활용하면 됩니다. 핵심 아이디어는 $subtract 연산자로 두 날짜의 밀리초 차이를 구한 뒤, 이를 1시간에 해당하는 밀리초 값인 3,600,000으로 나누는 것입니다.

1. 샘플 컬렉션 생성

먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.timestampDifferenceDemo.insertOne({
    "MovieBeginningTime": new ISODate("2019-05-12 10:20:30"),
    "MovieEndingTime": new ISODate("2019-05-12 12:30:20")
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd7ba1f6d78f205348bc644")
}
> db.timestampDifferenceDemo.insertOne({
    "MovieBeginningTime": new ISODate("2019-05-12 04:00:00"),
    "MovieEndingTime": new ISODate("2019-05-12 07:10:00")
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd7ba3b6d78f205348bc645")
}

2. 저장된 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.timestampDifferenceDemo.find().pretty();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
    "_id" : ObjectId("5cd7ba1f6d78f205348bc644"),
    "MovieBeginningTime" : ISODate("2019-05-12T10:20:30Z"),
    "MovieEndingTime" : ISODate("2019-05-12T12:30:20Z")
}
{
    "_id" : ObjectId("5cd7ba3b6d78f205348bc645"),
    "MovieBeginningTime" : ISODate("2019-05-12T04:00:00Z"),
    "MovieEndingTime" : ISODate("2019-05-12T07:10:00Z")
}

3. 애그리게이션으로 시간 차이 계산하기

이제 $project, $subtract, $divide 연산자를 조합하여 두 타임스탬프의 차이를 시간 단위로 계산해 보겠습니다.

> db.timestampDifferenceDemo.aggregate([
    {$project: {
        DifferenceInHours: {$divide: [{$subtract: ["$MovieEndingTime", "$MovieBeginningTime"]}, 3600000]}
    }}
]);

쿼리 동작 원리:

  • $subtract: 종료 시간에서 시작 시간을 빼어 두 날짜 간의 차이를 밀리초 단위로 반환합니다.
  • $divide: 밀리초 차이를 3,600,000(= 60분 × 60초 × 1,000밀리초, 즉 1시간)으로 나누어 시간 단위로 변환합니다.

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5cd7ba1f6d78f205348bc644"), "DifferenceInHours" : 2.1638888888888888 }
{ "_id" : ObjectId("5cd7ba3b6d78f205348bc645"), "DifferenceInHours" : 3.1666666666666665 }

4. 결과 해석 및 추가 팁

첫 번째 문서는 영화 상영 시간이 약 2.16시간(약 2시간 10분), 두 번째 문서는 약 3.17시간(약 3시간 10분)으로 계산되었습니다.

만약 소수점 없이 정수 시간만 필요하다면 $floor 또는 $round 연산자를 함께 사용하면 됩니다. 예를 들어 내림 처리를 하려면 다음과 같이 작성합니다.

> db.timestampDifferenceDemo.aggregate([
    {$project: {
        DifferenceInHours: {$floor: {$divide: [{$subtract: ["$MovieEndingTime", "$MovieBeginningTime"]}, 3600000]}}
    }}
]);

같은 방식으로 분 단위가 필요하면 60,000으로, 초 단위가 필요하면 1,000으로 나누면 되므로, 상황에 맞게 응용해 보시기 바랍니다.