在 SQL 中获取从开始日期到结束日期的会计年度

问题描述 投票:0回答:1

我的目标是获取客户所服务的财政年度,即使计划的开始和结束日期跨越多个财政年度。如果它们跨越多个会计年度,即使只有 1 天,那么我想看到每个会计年度的一行。我还需要考虑客户有计划开始日期但没有结束日期的情况......在这种情况下,我需要它仅输出开始日期的财政年度。我不确定我的代码是否捕获了所有场景。我也完成了此代码的其他迭代,但我无法获得预期的结果。

SELECT DISTINCT cp.document_id AS Client_ProfileID
,CASE
    WHEN (MONTH(pe.ServiceStartDate) >= 7 OR (MONTH(pe.ServiceStartDate) = 6 AND DAY(pe.ServiceStartDate) = 30)) 
        AND (MONTH(pe.ServiceEndDate) >= 7 OR (MONTH(pe.ServiceEndDate) = 6 AND DAY(pe.ServiceEndDate) = 30)) THEN YEAR(pe.ServiceStartDate)
    WHEN (MONTH(pe.ServiceStartDate) < 7 OR (MONTH(pe.ServiceStartDate) = 6 AND DAY(pe.ServiceStartDate) = 30)) 
        AND (MONTH(pe.ServiceEndDate) >= 7 OR (MONTH(pe.ServiceEndDate) = 6 AND DAY(pe.ServiceEndDate) = 30)) THEN YEAR(pe.ServiceEndDate) - 1
    ELSE YEAR(pe.ServiceEndDate)
END AS fiscal_year

--Removed Joins--

GROUP BY cp.document_id
,CASE
    WHEN (MONTH(pe.ServiceStartDate) >= 7 OR (MONTH(pe.ServiceStartDate) = 6 AND DAY(pe.ServiceStartDate) = 30)) 
        AND (MONTH(pe.ServiceEndDate) >= 7 OR (MONTH(pe.ServiceEndDate) = 6 AND DAY(pe.ServiceEndDate) = 30)) THEN YEAR(pe.ServiceStartDate)
    WHEN (MONTH(pe.ServiceStartDate) < 7 OR (MONTH(pe.ServiceStartDate) = 6 AND DAY(pe.ServiceStartDate) = 30)) 
        AND (MONTH(pe.ServiceEndDate) >= 7 OR (MONTH(pe.ServiceEndDate) = 6 AND DAY(pe.ServiceEndDate) = 30)) THEN YEAR(pe.ServiceEndDate) - 1
    ELSE YEAR(pe.ServiceEndDate)
END

GO

以下是如果客户开始日期为 2022 年 6 月 30 日且结束日期为 2022 年 7 月 1 日时我期望看到的示例输出:

Client_ProfileID 财政年度
1 2022
1 2023
sql date case distinct fiscal
1个回答
0
投票

构建并填充会计年度日历。例如:

CREATE TABLE FiscalYearCalendar (
    FiscalYear INT,
    StartDate DATE,
    EndDate DATE
);

INSERT INTO FiscalYearCalendar (FiscalYear, StartDate, EndDate)
VALUES 
(2023, '2022-07-01', '2023-06-30'),
(2024, '2023-07-01', '2024-06-30'),
;

现在一些示例数据来演示如何使用会计日历:

CREATE TABLE ServiceRecords (
    document_id INT,
    ServiceStartDate DATE,
    ServiceEndDate DATE
);

INSERT INTO ServiceRecords (document_id, ServiceStartDate, ServiceEndDate)
VALUES 
(1, '2023-01-01', '2023-02-21'),
(2, '2023-02-02', '2023-03-22'),
(3, '2023-03-03', '2023-04-23'),
(4, '2023-06-04', '2023-07-24'),
(5, '2023-07-05', '2023-07-25');

结合服务记录和会计日历,这将允许 1 条服务记录跨越多个会计年度,从而返回多行(请参阅 Client_ProfileID 4):

SELECT
      sr.document_id AS Client_ProfileID
    , fyc.FiscalYear
FROM ServiceRecords sr
JOIN FiscalYearCalendar fyc ON 
  (sr.ServiceStartDate <= fyc.EndDate AND sr.ServiceEndDate >= fyc.StartDate)
Client_ProfileID 财政年度
1 2023
2 2023
3 2023
4 2023
4 2024
5 2024

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.