MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Groupe agrégé par date avec décalage d'heure d'été

Le concept de base ici est de rendre votre requête "consciente" du moment où "l'heure d'été" "commence" et "se termine" pour la période de requête donnée et de simplement fournir ce test à $cond afin de déterminer quel "offset" utiliser :

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

Vous pouvez donc rendre cela un peu plus complexe lorsque vous couvrez plusieurs années, mais cela reste le principe de base. Dans l'hémisphère sud, vous êtes toujours s'étendant sur une année, de sorte que chaque condition serait une "plage" de "début" à "fin d'année" et de "début d'année" à "fin". Donc un $or avec un $and intérieur dans la "gamme" des opérateurs démontrée.

Si vous avez des valeurs différentes à appliquer, détectez quand vous "devriez" choisir l'une ou l'autre, puis appliquez en utilisant $cond .