我目前有一份报告,使用DATEPART返回一周的汽车'被退回了。然而,我在财政年度工作的业务从今年的第一个星期日开始(这个实例从2016年1月3日开始将是第1周)。但是,使用SQL' DATEPART wk'会在第2周返回此日期:
使用DATEPART(周,年等)的当前结果:
CarTitle ReturnDate Year Week
Car 1 30/12/2015 2015 53
Car 2 02/01/2016 2016 1
Car 3 03/01/2016 2016 2
Car 4 05/01/2016 2016 2
Car 5 10/01/2016 2016 3
Car 6 17/01/2016 2016 4
预期结果示例:
CarTitle ReturnDate Year Week
Car 1 30/12/2015 2015 53
Car 2 02/01/2016 2015 53
Car 3 03/01/2016 2016 1
Car 4 05/01/2016 2016 1
Car 5 10/01/2016 2016 2
Car 6 17/01/2016 2016 3
答案 0 :(得分:2)
我可以使用以下SQL计算:
SELECT
CarTitle,
DATEPART(ISO_WEEK, DATEADD(day, 1, ReturnDate))
FROM
dbo.My_Table
然而,这取决于您的本地化设置(可能与我的不同,因为您的日期如何表达日期),如果您在整个系统中使用此代码,那么业务部门决定更改它的方法计算几个星期然后你可能会遇到很大的重构问题。
我更喜欢使用Calendar表来处理这类事情:
CREATE TABLE dbo.Calendar (
calendar_date DATE NOT NULL,
week_number SMALLINT NOT NULL,
is_holiday BIT NOT NULL,
name VARCHAR(30) NOT NULL, -- i.e. 'January 6th, 2016'
CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED (calendar_date)
)
您可以根据需要扩展表格,例如,如果会计在一年中的某一周使用不同于另一个部门的定义,那么通过添加另一个列可以轻松容纳。然后,这会使您的查询成为一个简单的连接,以获取周数:
SELECT
MT.CarTitle,
MT.ReturnDate,
CAL.week_number
FROM
My_Table MT
INNER JOIN dbo.Calendar CAL ON CAL.calendar_date = MT.ReturnDate
你需要填充表格,但这应该是一次性的努力(提前50年填充它并且它仍然是一个非常小的表)并且你可以使用类似于我的第一个语句的代码来生成值 - 不要手动输入每个日期;)之后,如果业务逻辑发生变化(这比更改处理日期的所有查询更容易)或者如果您需要新的需求,则需要维护表新栏目。