如何修复此案例陈述以检查当前和未来年份而不会出错?
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
我需要检查日期字段以确定它是否在当前财政年度,例如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