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
.