好的,所以我有一份报告本周和上周比较,我们的客户注意到他们的数据“很时髦”.经过进一步调查,我们发现根据ISO标准,它没有正确进行数周.我将此脚本作为测试用例运行.
SET DATEFIRST 1 SELECT DATEPART(WEEK,'3/26/13'),DATEPART(WEEK,'3/27/12'),'3/20/12'),'1/2/12') SELECT DATEPART(ISO_WEEK,DATEPART(ISO_WEEK,'1/2/12')
跑步时我得到了这些结果.
我认为这很奇怪,所以我做了一些挖掘,发现sql Server将1月1日作为一年中的第一周,ISO计算1月的第一个星期日作为一年的第一周.
然后问题最终是两倍.问题1为什么会这样?问题2有没有办法改变这个,所以我不需要修改我的所有代码到处使用ISO_Week?
解决方法
当sql Server首次实现WEEK日期/部分时,他们必须做出选择.我不认为它有太多的意识,除了与当时最常见的标准保持一致 – 记住这是在符合标准不是首要任务的时候(否则我们没有像时间戳,IDENTITY和TOP).他们后来添加了ISO_WEEK(我认为是2008),因为在此期间的解决方法是编写自己的,缓慢的,糟糕的标量UDF – 实际上他们甚至创建了一个非常糟糕的并将其放入官方文档中(它已被删除为据我所知).
我不知道如何制作DATEPART(WEEK假装它是DATEPART(ISO_WEEK – 我认为你将不得不改变代码(如果你使用源代码控制,这应该不是很难 – 有多少地方是你执行这个计算吗?你有没有想过在某个地方计算它,所以你的代码不必充满它?因为你现在正在改变代码,这可能是考虑这个问题的时候了……).
如果你真的想要答案为什么?我认为你必须抓住一些原始的开发人员来确定他们选择默认的原因.再次,我认为这不是一个真正的“标准!”选择,而是“什么标准?”
这里有一些信息可能有用:
https://stackoverflow.com/questions/348880/getting-week-number-off-a-date-in-ms-sql-server-2005
http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/iso-week-in-sql-server