Grundkonceptet här är att göra din fråga "medveten" om när "sommartid" både "startar" och "slutar" för den givna frågeperioden och helt enkelt skicka detta test till $cond
för att avgöra vilken "offset" som ska användas:
db.collection.aggregate([
{ "$group": {
"_id": {
"$week": {
"$add": [
"$Timestamp",
{ "$cond": [
{ "$and": [
{ "$gte": [
{ "$dayOfyear": "$Timestamp" },
daylightSavingsStartDay
]},
{ "$lt": [
{ "$dayOfYear": "$Timestamp" },
daylightSavingsEndDay
]}
]},
daylightSavingsOffset,
normalOffset
]}
]
}
},
"min": { "$min": "$Timestamp" }
}}
])
Så du kan göra det lite mer komplext när du täcker flera år, men det är fortfarande grundprincipen. På södra halvklotet är du alltid sträcker sig över ett år så varje villkor skulle vara ett "intervall" av "start" till "slut på året" och "början av året" till "slut". Därför en $or
med en inre $and
inom det "intervall" som visas.
Om du har olika värden att tillämpa, upptäck då när du "bör" välja endera och använd sedan $cond
.