如何修复此案例陈述以检查当前和未来年份而不会出错?

How do I fix this Case Statement to check current and future year without getting an error?

我需要检查日期字段以确定它是否在当前财政年度,例如2019 年,或下一个财政年度,例如2020 年,取决于月份是否在一月和七月之间。如果月份 <= 7,则应分配当前年份,但如果月份 > 7,则分配下一年。

使用分期table,我试过的SQL如下:

SELECT * FROM StagingTable
WHERE StagingTable.FY = 
    CASE WHEN MONTH (GETDATE()) <= 7 
         THEN YEAR (GETDATE())
    ELSE DATEPART(YYYY,DATEADD(YY, 1, GETDATE()))

我也尝试使用以下简单代码来确定我的错误,但就是无法弄清楚为什么会出现错误。

SELECT CASE 
    WHEN MONTH (GETDATE()) <= 7 
    THEN YEAR (GETDATE())
    ELSE DATEPART(YYYY,DATEADD(YY, 1, GETDATE())) 

我希望将 2019 年或 2020 年分配给 StagingTable.FY 列。代码看起来相当简单,但我就是无法让它工作。有什么建议吗?

您缺少 CASE

END
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
END;

或者

CASE WHEN MONTH (GETDATE()) <= 7 
     THEN YEAR (GETDATE())
     ELSE YEAR (GETDATE()) + 1
END;

您的案例陈述需要 'end' 关键字。而且...

Year(date) 输出一个整数。所以考虑:

select    * 
from      StagingTable
where     StagingTable.FY = 
             case 
             when month(getdate()) <= 7 then year(getdate())
             else year(getdate()) + 1
             end

或者,如果您的版本支持 iif

select    * 
from      StagingTable
where     StagingTable.FY = year(getdate()) + iif(month(getdate()) <= 7, 0, 1)

或者,正如@EzLo 在评论中指出的那样,您可以创建一个日历 table:

create table dates (
    day date primary key not null,
    fiscalYear int not null
);
go

-- schedule this to run daily
create procedure dates_populate as
    insert dates (day, fiscalYear) values (
        getdate(),
        year(getdate()) + iif(month(getdate()) <= 7, 0, 1)
    );
go

select    st.*
from      StagingTable st
join      dates d on st.fy = d.fiscalYear and d.day = getdate()

这种方法更难设置,但它的好处是效率更高,在编写代码时避免了 case 语句,并允许您拥有更多可能对您在其他查询中有益的日期相关属性。

添加到 YEAR(GETDATE()) 0 或 1 取决于月份:

SELECT * FROM StagingTable
WHERE StagingTable.FY = YEAR(GETDATE()) + 
    CASE WHEN MONTH(GETDATE()) <= 7 
      THEN 0
      ELSE 1
    END