Sql server T-SQL-选择最近学年的结果

Sql server T-SQL-选择最近学年的结果,sql-server,tsql,Sql Server,Tsql,我有一个表,当与日期时间连接时,可以返回学年 所以结果是这样的 ID | Date | Academic year ---------------------------------------------- 1 | 2020-11-09 00:00:00.000 | 2020/21 ---------------------------------------------- 2 | 2021-01-10 00:00:00.000 | 2020

我有一个表,当与日期时间连接时,可以返回学年 所以结果是这样的

ID |          Date           | Academic year
----------------------------------------------
1  | 2020-11-09 00:00:00.000 |   2020/21 
----------------------------------------------
2  | 2021-01-10 00:00:00.000 |   2020/21
----------------------------------------------
3  | 2020-02-01 00:00:00.000 |   2019/20
我想要的是只返回最近/当前学年的成绩。请注意,学年不是日期数据类型,因此排除了所有日期函数。我不想在where条款中只使用“2020/21”,因为学年当然会在9月份改变


我正在使用SSMS版本15

我相信这将实现以下目的:

SELECT * FROM [TableName] WHERE SUBSTRING([Academic year], 1, 4) = FORMAT(GETDATE(), 'yyyy')
如果学年在9月开始,那么您将需要以下内容:

DECLARE @AccYearParm VARCHAR(7) = '2020/08';
SELECT * FROM [TableName] WHERE SUBSTRING([Academic year], 1, 7) > @AccYearParm 

WHERE
子句中使用
CASE
表达式,检查当前月份是否为9或更大,因为这是区分学年的条件:

SELECT * 
FROM tablename
WHERE YEAR(GETDATE()) = CAST(LEFT(Academic_year, 4) AS INTEGER) + 
                        CASE WHEN MONTH(GETDATE()) >= 9 THEN 0 ELSE 1 END 
如果当前月份为9或更大,则当前年份必须等于
学年的前4个字符

如果小于9,则当前年份必须等于
学年的前4个字符
+1.


请参阅。

我不认为这会导致第2行在学年中没有返回任何内容unfortunately@user3513098,请查看我的最新编辑,我相信这是因为您仍处于2020年?@PeterSmith,关于第一个查询,您是对的,我认为这是样本数据,但它实际上指明了当前学年,即2020年。@Nemavhidi在某种程度上确实有效,但在明年之后,当我们在2021/22 ac年时,它仍将返回2020/21结果。您使用什么业务规则来确定当前学年?请阅读一些关于改进您的问题的提示。“请注意,学年不是日期数据类型”是一个很好的玩笑。为什么不分享数据类型呢?嗨@forpas,谢谢你,这似乎很有效!你能再取消点击一下你的cast/case来解释我的利益吗?@user3513098当你在九月、十月、十一月或十二月运行此代码时,case表达式返回0。在任何其他月份,它返回1。因此,在9月、10月、11月或12月,WHERE子句将当前年份与整数进行比较,整数由学年的前4个字符表示,但在其他月份,WHERE子句将其与当年+1进行比较。例如,2021年4月,学年为2020/21,因此当前年份的比较必须为2021=2020(前4个字符)+1。