如何修正DELETE查询?字符串类型sessiondate的SELECT查询报错解决
问题解答
一、关于DELETE语句的修正
嘿,你没贴出要修正的DELETE语句具体内容哦😉,麻烦把原语句发出来,我帮你排查问题、调整修正~
二、SELECT查询的日期比较问题
你遇到的Conversion failed when converting date and/or time from character string错误,原因很明确:DATEADD函数需要接收日期/时间类型的参数,但你的sessiondate是字符串类型,而且格式还不符合日期规范,SQL Server在尝试自动把它转成日期类型时直接失败了。
能不能不转换为日期类型直接执行查询?
实话说,如果sessiondate的字符串格式乱七八糟、不统一的话,几乎没办法准确实现你的查询逻辑。因为字符串的排序规则和日期的时间先后规则完全不一样——比如01/02/2024作为字符串比12/31/2023大,但如果是MM/DD/YYYY格式的话,前者实际日期更早,直接比字符串的话结果全错。
只有一种特殊情况可以试试:如果sessiondate的格式是绝对统一且能通过字符串顺序对应日期先后的(比如全是YYYYMMDD、YYYY-MM-DD HH:mm:ss这种),那可以这么操作:
- 把
insertdate转成和sessiondate一模一样的字符串格式 - 把
sessiondate转成日期类型(因为格式统一,这次转换不会失败),计算出30天前的日期,再转成相同格式的字符串 - 直接比较两个字符串的大小
举个例子(假设sessiondate是YYYYMMDD格式):
SELECT * FROM faults WHERE CONVERT(VARCHAR(8), insertdate, 112) < CONVERT(VARCHAR(8), DATEADD(DAY, -30, CONVERT(DATE, sessiondate, 112)), 112)
不过说实话,这里还是绕不开把sessiondate转成日期类型来计算30天前的日期,只是最后用字符串比较而已——核心还是依赖格式统一的前提。
更稳妥的解决办法
既然sessiondate是字符串且格式有问题,最靠谱的方案还是先处理这个字段:
- 先用
TRY_CONVERT函数做容错转换,这样不会因为个别异常数据抛出错误,还能正常查询能转换的行:
这个语句会自动跳过那些SELECT * FROM faults WHERE insertdate < DATEADD(DAY, -30, TRY_CONVERT(DATE, sessiondate))sessiondate无法转成日期的行,不会报错。 - 长期来看,强烈建议把
sessiondate字段的类型改成DATE或者DATETIME,从根源上解决这类转换问题。改类型之前记得先清理掉那些无法转成日期的异常数据哦~
内容的提问来源于stack exchange,提问作者fusolage
相关产品推荐
相关产品推荐

