Varchar年月与Date类型字段对比筛选:日期范围报错修正方案
解决月份日期范围查询的无效日期问题
你的问题出在固定拼接-31作为月末日期,像6月这样只有30天的月份,会生成2022-06-31这种无效日期,导致SQL报错。可以用以下两种可靠的方式修改:
方法一:自动计算月末日期
先把字符串变量转成当月第一天的日期类型,再通过日期函数算出下个月第一天,最后减1天得到正确的月末日期:
declare @date varchar(6)= '202206'; -- 转换为当月第一天的日期 declare @startDate date = cast(left(@date,4) + '-' + right(@date,2) + '-01' as date); -- 计算当月最后一天:下个月第一天减1天 declare @endDate date = dateadd(day, -1, dateadd(month, 1, @startDate)); select * from xxx where [DateTime] between @startDate and @endDate;
方法二:用下个月第一天作为范围上限(更推荐)
不需要计算月末,直接查询日期大于等于当月第一天,且小于下个月第一天的记录。这种方式不仅避免了无效日期问题,还能兼容带时间的datetime类型(不会漏掉23:59:59的记录,也不会包含下个月00:00:00的记录):
declare @date varchar(6)= '202206'; declare @startDate date = cast(left(@date,4) + '-' + right(@date,2) + '-01' as date); -- 获取下个月第一天 declare @nextMonthStart date = dateadd(month, 1, @startDate); select * from xxx where [DateTime] >= @startDate and [DateTime] < @nextMonthStart;
两种方法都能自动适配不同月份的天数,不会再出现无效日期的报错。
内容的提问来源于stack exchange,提问作者Lily
相关产品推荐
相关产品推荐

