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
.