【问题标题】:Dynamically calculate end of fiscal year(s) and weeks to that date动态计算截至该日期的财政年度结束和周数
【发布时间】:2017-10-17 09:48:47
【问题描述】:

我正在计算如果员工从年中开始工作到当前财政年度结束(4 月 1 日至 3 月 31 日),他们将工作多少周。

例如,一名员工于 2017 年 1 月 10 日(英国日期)开始在公司工作,我需要计算他们到 2018 年 3 月 31 日(含)之前的工作周数。

员工开始日期的字段是“员工”表中的“START_DATE”。我还有一个日历表,其中包含您可以想象的每种日期格式,还包括财政年度。

我发现了这个问题,但它并没有完全解决我的问题:Calculate totals of field based on current fiscal year only - SQL

非常感谢任何帮助。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这确实取决于您如何对一周进行分类。一定要整整一周吗?从不是星期一的一天开始是否意味着如果他们在不是星期五的一天结束,就不算整周? 这是您必须确定业务逻辑的地方

    以下是一些基本的DATEDIFF 操作,可用于计算两个日期之间的差异,您可以将其用作计算的基础:

    DECLARE @startDate DATE = '2017-10-01'
    DECLARE @endDate DATE = '2018-03-31'
    
    SELECT @startDate StartDate, @endDate EndDate, 
            DATEDIFF(DAY, @startDate, @endDate) DaysPassed,
            DATEDIFF(WEEK, @startDate, @endDate) WeeksWorked,
            DATEDIFF(DAY, @startDate, @endDate) / 7.0 CalculatedWeeksWorked
    

    生产:

    StartDate  EndDate    DaysPassed  WeeksWorked CalculatedWeeksWorked
    ---------- ---------- ----------- ----------- ---------------------
    2017-10-01 2018-03-31 181         25          25.857142
    

    此外,您可能需要考虑不包括周末的工作天数,以计算出工作了多少周,如果是这样,请查看此帖子:

    get DATEDIFF excluding weekends using sql server

    财政年度

    要计算财政年度,您应该能够像这样简单地查看日期的月份值:

    DECLARE @startDate DATE = '2017-10-01';
    
    -- if the month is greater than 3, add a year, else take the current year
    SELECT CASE
               WHEN DATEPART(MONTH, @startDate) > 3 THEN
                   CAST(DATEPART(YEAR, @startDate) + 1 AS VARCHAR(10)) + '-03-31'
               ELSE
                   CAST(DATEPART(YEAR, @startDate) AS VARCHAR(10)) + '-03-31'
           END AS fiscalYearEnd;
    

    编辑@startDate 并测试上述内容,希望它适用于大多数情况。我已经对其进行了快速测试,它似乎返回了预期的结果。

    【讨论】:

    • 感谢您的回复。虽然这会起作用,但问题是没有“结束日期”,“结束日期”是当前财政年度的最后一天,这是我在搞清楚时遇到的问题(正如我正在写的报告未来将持续多年)。所以我需要弄清楚的是如何根据“开始日期”计算财政年度结束日期。
    • 太棒了!我已经快速进行了测试,它似乎工作得很好。谢谢。
    【解决方案2】:

    DATEDIFF function:

    ROUND(DATEDIFF(CURRENT_TIMESTAMP, START_DATE)/7, 0) AS weeks
    

    其中 0 是小数位数。

    WEEKS 的问题在于它不会为超过 1 月 1 日的日期返回正确的结果。

    【讨论】:

    • 不幸的是,这没有考虑财政年度。节假日紧随财政年度(4 月 1 日至 3 月 31 日)。
    猜你喜欢
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多