복붙노트

[MONGODB] 어떻게 다른 시간대에 년 - 월 - 일까지 집계합니다

MONGODB

어떻게 다른 시간대에 년 - 월 - 일까지 집계합니다

나는 UTC에서 날짜 개체를 저장 MongoDB에 있습니다. 글쎄, 난 다른 시간대 (CET)에 연도 별 집계, 월 일을 수행 할.

이 일을, UTC를 위해 잘 작동합니다 :

    BasicDBObject group_id = new BasicDBObject("_id", new BasicDBObject("year", new BasicDBObject("$year", "$tDate")).
                append("month", new BasicDBObject("$month", "$tDate")).
                append("day", new BasicDBObject("$dayOfMonth", "$tDate")).
                append("customer", "$customer"));

    BasicDBObject groupFields = group_id.
            append("eventCnt", new BasicDBObject("$sum", "$eventCnt")); 

    BasicDBObject group = new BasicDBObject("$group", groupFields);

명령 줄을 사용하는 경우 또는, (테스트하지, 난 단지 자바 버전을 테스트) :

{
    $group: {
        _id: {
            "year": {
                "$year", "$tDate"
            },
            "month": {
                "$month", "$tDate"
            },
            "day": {
                "$dayOfMonth", "$tDate"
            },
            "customer": "$customer"
        },
        "eventCount": {
            "$sum": "$eventCount"
        }
    }
}

어떻게 집계 프레임 워크 내부 CET에이 날짜를 변환합니까?

예를 들어 '2013년 9월 16일 세계 협정시 23시 45분 0초은'이 다른 날, '2013년 9월 17일 중부 유럽 표준시 00시 45분 0초'입니다.

해결법

  1. ==============================

    1.나는 MongoDB를 날짜 형식으로 적절한 변환 (시간 추가)해야 CET과 UTC의 관계에 있지만, (쉘의 경우) 다음 코드에 대한 전문가가 아니에요 :

    나는 MongoDB를 날짜 형식으로 적절한 변환 (시간 추가)해야 CET과 UTC의 관계에 있지만, (쉘의 경우) 다음 코드에 대한 전문가가 아니에요 :

    db.dates.aggregate(
      {$project: {"tDate":{$add: ["$tDate", 60*60*1000]}, "eventCount":1, "customer":1}}
    )
    

    당신이 당신의 파이프 라인의 나머지 전에 프로젝트 명령을 실행하면, 결과는 CET에 있어야합니다.

  2. ==============================

    2.시간 검색 후, 이것은 나를 위해 일한 솔루션입니다. 그것은 또한 매우 간단합니다. 그냥 오프셋 (offset)를 밀리 세컨드 단위의 시간대를 빼서 시간대를 변환합니다.

    시간 검색 후, 이것은 나를 위해 일한 솔루션입니다. 그것은 또한 매우 간단합니다. 그냥 오프셋 (offset)를 밀리 세컨드 단위의 시간대를 빼서 시간대를 변환합니다.

    = 25,200,000 7시간 오프셋 // 420 분 * 60 * 1000 밀리 초

    $group: {
        _id = { 
            year: { $year : [{ $subtract: [ "$timestamp", 25200000 ]}] }, 
            month: { $month : [{ $subtract: [ "$timestamp", 25200000 ]}] }, 
            day: { $dayOfMonth : [{ $subtract: [ "$timestamp", 25200000 ]}] }
        },
        count = { 
            $sum : 1
        }
    };
    
  3. ==============================

    3.당신은 3.6에서 시작 날짜 사업자 시간대를 제공 할 수 있습니다.

    당신은 3.6에서 시작 날짜 사업자 시간대를 제공 할 수 있습니다.

    시간대와 시간대를 교체합니다.

    {
      "$group":{
        "_id":{
          "year":{"$year":{"date":"$tDate","timezone":"America/Chicago"}},
          "month":{"$month":{"date":"$tDate","timezone":"America/Chicago"}},
          "dayOfMonth":{"$dayOfMonth":{"date":"$tDate","timezone":"America/Chicago"}}
        },
        "count":{"$sum":1}
      }
    }
    
  4. ==============================

    4.예를 들어 moment.js에 대한 사용 CET에 대한 현재의 오프셋 (offset) 시간대를 결정하지만,이 방법은 여름 겨울 오프셋을 얻을

    예를 들어 moment.js에 대한 사용 CET에 대한 현재의 오프셋 (offset) 시간대를 결정하지만,이 방법은 여름 겨울 오프셋을 얻을

    var offsetCETmillisec = moment.tz.zone('Europe/Berlin').offset(moment())* 60 * 1000;
    
      $group: {
        _id: {
          'year': {'$year': [{ $subtract: [ '$createdAt', offsetCETmillisec ]}] },
          'month': {'$month': [{ $subtract: [ '$createdAt', offsetCETmillisec ]}] },
          'day': {'$dayOfMonth': [{ $subtract: [ '$createdAt', offsetCETmillisec ]}] }
        },
        count: {$sum: 1}
      }
    }
    
  5. ==============================

    5.MongoDB의 설명서는 타임 스탬프와 함께 오프셋 시간대를 저장하는 것이 제안한다 :

    MongoDB의 설명서는 타임 스탬프와 함께 오프셋 시간대를 저장하는 것이 제안한다 :

    var now = new Date();
    db.data.save( { date: now,
                    offset: now.getTimezoneOffset() } );
    

    이것은 물론하지 이상적인 솔루션입니다 -하지만 하나 그 작품, 우리는 MongoDB의의 집계 파이프 라인에 적절한 $ (UTC) OFFSET 기능이 때까지.

  6. ==============================

    6.시간대에이 솔루션은 좋은 하나이지만, 버전 3.6에서 당신은 또한 그래서, 당신이 사용할 준비가 결과를 얻을 시간대를 사용하여 출력 형식을 지정할 수 있습니다 :

    시간대에이 솔루션은 좋은 하나이지만, 버전 3.6에서 당신은 또한 그래서, 당신이 사용할 준비가 결과를 얻을 시간대를 사용하여 출력 형식을 지정할 수 있습니다 :

    {
    "$project":{
        "year_month_day": {"$dateToString": { "format": "%Y-%m-%d", "date": "$tDate", "timezone": "America/Chicago"}}
    },
    "$group":{
        "_id": "$year_month_day",
        "count":{"$sum":1}
    }
    }
    

    당신의 "$ 일치"또한 시간대를 고려 있는지 확인하십시오, 그렇지 않으면 당신은 잘못된 결과를 얻을 수 있습니다.

  7. ==============================

    7.MongoDB를은 UTC에 날짜를 저장 이 절차를 그래서 다른 영역에서 그들을 얻을 수 있습니다

    MongoDB를은 UTC에 날짜를 저장 이 절차를 그래서 다른 영역에서 그들을 얻을 수 있습니다

    기본적으로 그것은 이것이다 : 시간대에 정상화 후 시프트 $ 일치 (UTC)에 입력 (들)합니다.

  8. ==============================

    8.

    <?php
        date_default_timezone_set('Asia/Karachi');
        $date=getdate(date("U"));
        $day = $date['mday'];
        $month =$date['mon'];
        $year = $date['year'];
        $currentDate = $year.'-'.$month.'-'.$day;
    ?>
    
  9. from https://stackoverflow.com/questions/18852095/how-to-aggregate-by-year-month-day-on-a-different-timezone by cc-by-sa and MIT license