MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aggregierte Gruppierung nach Datum mit Sommerzeitversatz

Das Grundkonzept hier besteht darin, Ihrer Abfrage „bewusst“ zu machen, wann die „Sommerzeit“ für den angegebenen Abfragezeitraum „beginnt“ und „endet“, und diesen Test einfach an $cond um zu bestimmen, welcher "Offset" verwendet werden soll:

db.collection.aggregate([
    { "$group": {
       "_id": {
           "$week": {
               "$add": [
                  "$Timestamp",
                  { "$cond": [
                      { "$and": [
                          { "$gte": [
                             { "$dayOfyear": "$Timestamp" },
                             daylightSavingsStartDay 
                          ]},
                          { "$lt": [ 
                             { "$dayOfYear": "$Timestamp" },
                             daylightSavingsEndDay
                          ]}
                      ]},
                      daylightSavingsOffset,
                      normalOffset
                  ]}
               ]
           }
       },
       "min": { "$min": "$Timestamp" }
    }}
])

Man kann das also etwas komplexer machen, wenn man mehrere Jahre abdeckt, aber es ist immer noch das Grundprinzip. Auf der Südhalbkugel sind Sie immer ein Jahr überspannt, so dass jede Bedingung ein "Bereich" von "Beginn" bis "Ende des Jahres" und "Anfang des Jahres" bis "Ende" wäre. Also ein $or mit einem inneren $and innerhalb der "range"-Operatoren demonstriert.

Wenn Sie unterschiedliche Werte anwenden müssen, erkennen Sie, wann Sie einen auswählen "sollten", und wenden Sie ihn dann mit $cond .