SQL查询日期转换错误求助:DATEADD函数使用问题排查
SQL查询错误分析与解决
错误原因
错误提示Conversion failed when converting date and/or time from character string的核心原因是:sub._starts_at_字段的数据类型为字符串(varchar/nvarchar),而DATEADD、GETDATE()返回的是datetime类型。当SQL Server执行比较操作时,会自动尝试将字符串类型的_starts_at_转换为datetime,若字段中存在格式不合法的日期字符串,就会触发转换失败。你单独使用DATEADD时正常,是因为没有涉及到字符串与日期类型的比较操作。
解决方法
方法一:显式转换字符串为日期类型
如果_starts_at_存储的是标准格式的日期字符串(如yyyy-MM-dd HH:mm:ss),可以通过显式转换来避免自动转换出错:
SELECT ---- FROM dbo.LocationRevenues AS lr INNER JOIN dbo.Subscriptions AS sub ON (lr.order_number_id = sub._order_number_id_) WHERE CONVERT(datetime, sub._starts_at_, 120) BETWEEN DATEADD(MONTH, -1, GETDATE()) AND GETDATE() AND lr.subchannel_code = 'Channel' AND lr.location_name != 'LocationA';
注:120是SQL Server对应yyyy-MM-dd HH:mm:ss格式的转换代码,若你的日期字符串格式不同,需替换为对应代码(如101对应MM/dd/yyyy)。
方法二:修改字段数据类型(推荐)
如果业务允许,直接将sub._starts_at_的数据类型修改为datetime或datetime2,从根源上避免类型转换问题,这是最稳妥的方案。
补充:筛选过去一个月的逻辑优化
如果你需要的是上个月整月的数据(而非当前日期往前推30天),可以调整条件为:
WHERE CONVERT(datetime, sub._starts_at_, 120) >= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE())-1, 1) AND CONVERT(datetime, sub._starts_at_, 120) < DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)
该逻辑会精准匹配上个月1日0点到当月1日0点之前的所有数据。
内容的提问来源于stack exchange,提问作者nicolehanah2355
相关产品推荐
相关产品推荐

