MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Raggruppa per data con offset ora legale

Il concetto di base qui è rendere la tua query "consapevole" di quando "l'ora legale" sia "inizia" che "finisce" per il periodo di query specificato e fornisci semplicemente questo test a $cond per determinare quale "offset" utilizzare:

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

Quindi puoi renderlo un po 'più complesso quando copri diversi anni, ma è ancora il principio di base. Nell'emisfero australe sei sempre nell'arco di un anno, quindi ogni condizione sarebbe un "intervallo" da "inizio" a "fine anno" e "inizio anno" a "fine". Quindi un $or con un $and interno all'interno dell'"intervallo" mostrato dagli operatori.

Se hai valori diversi da applicare, rileva quando "dovresti" scegliere uno dei due e quindi applica utilizzando $cond .