据我所知,差异分为两个主要领域,文档中描述了简单的部分:
周从星期日开始,第 1 周从一年中的第一个星期日开始。一年中第一个星期日之前的日子在第 0 周。此行为与 strftime 标准库函数的“%U”运算符相同。
所以这里的一般概念是返回的值将在 0 和 53 之间(含),第 0 周被定义为星期天之前的第一周。
所以从technet source 中解释(因为文档弄错了日期)“datepart”:
任何年份的 1 月 1 日定义星期日期部分的起始数字,例如:DATEPART (wk, 'Jan 1, xxxx') = 1,其中 xxxx 是任何年份。
然后(更正):
下表列出了每个 SET DATEFIRST 参数的“2007-04-21”的星期和工作日日期部分的返回值。 1 月 1 日是 2007 年的星期六。4 月 21 日是 2007 年的星期六。SET DATEFIRST 7,星期日,是美国英语的默认值。
所以你有这样的文件:
{ "date" : ISODate("2007-01-01T00:00:00Z") }
{ "date" : ISODate("2006-12-31T00:00:00Z") }
{ "date" : ISODate("2006-01-01T00:00:00Z") }
$week 运算符将返回如下所示:
{ "date" : ISODate("2007-01-01T00:00:00Z"), "week" : 0 }
{ "date" : ISODate("2006-12-31T00:00:00Z"), "week": 53 }
{ "date" : ISODate("2006-01-01T00:00:00Z"), "week" : 1 }
2006 年 1 月 1 日是星期日,被认为是第 1 周的开始,但如果是星期六,则为 2007 年的第 0 周。上一年的 12 月 31 日是第 53 周。
相比之下,DATEPART 将 2007 年 1 月 1 日和 2006 年 12 月 31 日视为第 1 周作为一年中第一个星期日结束的一周。星期日是默认的美国英语值,但可能会有所不同,实际上可以通过 SET DATEFIRST 设置
因此,就一年中的第几周而言,两者对日期的归属有不同的看法,但总体差异将是一个,而其他考虑日期则在上一年年底。