Хотя я считаю эту технику очень грязной, месяцами она работает.Это потому, что в году всегда 12 месяцев.
В течение нескольких недель это и грязно, и порочно.Некоторые годы имеют больше недель, чем другие, потому что некоторые недели охватывают более одного года.
Я бы рекомендовал вместо этого просто использовать DATEDIFF()
.
В зависимости от желаемого дня неделичтобы начать свои недели, нужно немного подсчитать ...
- Sun as start of week = DATEDIFF(WEEK, -1, yourDate )
- Mon as start of week = DATEDIFF(WEEK, -1, yourDate-1)
- Tue as start of week = DATEDIFF(WEEK, -1, yourDate-2)
- Wed as start of week = DATEDIFF(WEEK, -1, yourDate-3)
- Thu as start of week = DATEDIFF(WEEK, -1, yourDate-4)
- Fri as start of week = DATEDIFF(WEEK, -1, yourDate-5)
- Sat as start of week = DATEDIFF(WEEK, -1, yourDate-6)
Я также рекомендую использовать это для расчетов за месяц.DATEDIFF(MONTH, <a base date>, <your date>)
, текущий действительно неуклюжий.
РЕДАКТИРОВАТЬ Примеры преобразования указанных значений обратно в DATETIME
- Sun as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate ), -1 )
- Mon as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-1), -1+1)
- Tue as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-2), -1+2)
- Wed as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-3), -1+3)
- Thu as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-4), -1+4)
- Fri as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-5), -1+5)
- Sat as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-6), -1+6)