【问题标题】:SQL DatePart Week, year to reflect fiscal yearSQL DatePart 周,反映财政年度的年份
【发布时间】:2016-01-06 13:31:19
【问题描述】:

我目前有一份报告,它使用 DATEPART 来返回“汽车”被退回的那一周。但是,我在会计年度工作的业务开始于一年中的第一个星期日(从 2016 年 3 月 1 日开始的这个实例将是第 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

【问题讨论】:

    标签: sql tsql ssms datepart


    【解决方案1】:

    我可以用下面的 SQL 来计算:

    SELECT
        CarTitle,
        DATEPART(ISO_WEEK, DATEADD(day, 1, ReturnDate))
    FROM
        dbo.My_Table
    

    但是,这取决于您的本地化设置(考虑到您表达日期的方式,这可能与我的不同)以及您是否在整个系统中使用此代码,然后企业决定更改其方法如果计算周数,那么您最终可能会遇到严重的重构难题。

    我更喜欢使用日历表来处理这类事情:

    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 年填充它,它仍然是一个非常小的表格),您可以使用类似于我的第一个语句的代码来生成值- 不要手动输入每个日期;)之后,如果业务逻辑发生变化(这比更改所有处理日期的查询更容易)或者如果您有一个需要新列。

    【讨论】:

    • 感谢您的回答。我已经实现了 DATEPART(ISO_week 因为这解决了周问题,谢谢你。我还阅读了一些关于潜在 ISO_Year 函数的内容并根据需要实现了这个。这已经解决了“周”和“年”的问题'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多