存储过程日期参数兼容问题:仅支持MM-DD-YYYY不兼容DD-MM-YYYY
解决存储过程日期格式不匹配的问题
问题根源
当前存储过程用varchar类型接收日期参数,数据库执行CAST(@FromDate AS Date)时,会按照服务器默认的日期格式(此处为MM-DD-YYYY)解析字符串。当客户端传入DD-MM-YYYY格式的日期(比如15-03-2024),数据库会把前两位当成月份,15不是合法月份,解析失败或得到错误的日期,导致WHERE条件不匹配,返回空结果。
方案1:改用日期类型参数(推荐)
直接把参数类型从varchar改成date或datetime,客户端传入的日期字符串会被正确转换为日期类型,彻底规避格式问题:
@FromDate date, @ToDate date SELECT DISTINCT dbo.DefectInspection.DefectInspection_Id, CONVERT(varchar(50), CAST(dbo.DefectInspection.DefectInspection_CreatedDate AS date), 34) AS CreatedDate FROM (bunch of tables) WHERE CAST(DefectInspection.DefectInspection_CreatedDate AS date) BETWEEN @FromDate AND @ToDate
方案2:指定格式解析字符串日期(无法改参数类型时使用)
如果必须保留varchar参数,使用CONVERT函数并指定格式代码103(对应DD-MM-YYYY格式)来转换输入的日期字符串:
@FromDate varchar(50), @ToDate varchar (50) SELECT DISTINCT dbo.DefectInspection.DefectInspection_Id, CONVERT(varchar(50), CAST(dbo.DefectInspection.DefectInspection_CreatedDate AS date), 34) AS CreatedDate FROM (bunch of tables) WHERE CAST(DefectInspection.DefectInspection_CreatedDate AS date) BETWEEN CONVERT(date, @FromDate, 103) AND CONVERT(date, @ToDate, 103)
格式代码103会告诉SQL Server按照DD-MM-YYYY的规则解析输入字符串,确保转换后的日期值正确。
内容的提问来源于stack exchange,提问作者m.Hashaam
相关产品推荐
相关产品推荐

