能否在LIKE语句中使用YEAR(CURDATE())?SQL查询问题咨询
问题解决:基于字符串字段中的年份筛选数据
首先,你可以用LIKE实现需求,但原语句存在两个明显问题:
CURDATE()并非所有SQL数据库都支持(比如SQL Server就不识别这个函数),需要根据你使用的数据库替换为对应函数;LIKE YEAR(CURDATE())写法错误:YEAR()返回数字类型,而LIKE需要字符串匹配,且你没加通配符,数据库无法定位要匹配的字段位置。
一、用LIKE实现的正确写法
先处理函数兼容问题:
- MySQL/MariaDB:使用
CURDATE() - SQL Server:使用
GETDATE() - Oracle:使用
SYSDATE - PostgreSQL:使用
CURRENT_DATE
修正LIKE匹配逻辑
由于年份固定在(FY 2021)这类格式中,建议添加精准通配符,避免误匹配字段中其他位置的数字:
SQL Server示例:
WHERE ID_TYPE_NAME LIKE 'MS-DRG%' AND ID_TYPE_NAME LIKE '%FY ' + CAST(YEAR(GETDATE()) AS VARCHAR(4)) + ')'
MySQL示例:
WHERE ID_TYPE_NAME LIKE 'MS-DRG%' AND ID_TYPE_NAME LIKE CONCAT('%FY ', YEAR(CURDATE()), ')')
二、更可靠的精准匹配方法(推荐)
直接用字符串提取函数取出字段中的年份,再与当前年份对比,比LIKE更稳定,不会因字段格式微小变化出错:
SQL Server示例:
WHERE ID_TYPE_NAME LIKE 'MS-DRG%' AND CAST(SUBSTRING(ID_TYPE_NAME, CHARINDEX('FY ', ID_TYPE_NAME) + 3, 4) AS INT) = YEAR(GETDATE())
逻辑:用CHARINDEX定位FY 的位置,向后偏移3位跳过"FY ",截取4个字符得到年份,转成数字后与当前年份对比。
MySQL示例:
WHERE ID_TYPE_NAME LIKE 'MS-DRG%' AND CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(ID_TYPE_NAME, 'FY ', -1), ')', 1) AS UNSIGNED) = YEAR(CURDATE())
逻辑:先用SUBSTRING_INDEX取出FY 之后的内容,再用一次取出)之前的内容,得到年份后转成数字对比。
内容的提问来源于stack exchange,提问作者Steven Lee Rad
相关产品推荐
相关产品推荐

