有客自远方来52 2024-04-21 23:56 采纳率: 15.3%
浏览 1
已结题

为什么会出现数据类型转换的错误?(语言-python|开发工具-pycharm)

我想实现日期增加天数,从错误来看日期已经增加了,但是为什么还会出现数据转换错误的问题
功能实现代码

def update(self):
    datestr = self.timeInput.text()
    date_time_obj = datetime.strptime(datestr, '%Y-%m-%d')
    new_date = (date_time_obj + timedelta(days=7)).strftime('%Y-%m-%d')
    borrow2 = Rbook.my_construtor2(None, None, None, new_date)
    if borrowDao.add(borrow2) > 0:
        self.x = show_custom_message_box("系统提示", "借阅成功!")
        self.resetForm()
        self.initTable()
    else:
        self.x = show_custom_message_box("系统提示", "借阅失败!")

数据库模块代码

def update(rbook: Rbook) -> int:
    """
    更新数据
    :param rbook:
    :return:
    """
    con = None
    try:
        con = dbUtil.getCon()
        cursor = con.cursor()
        # 更新数据
        sql = f"UPDATE borrow SET returnDate = DATEADD(week, 1, '{rbook.returnDate}') WHERE bid = '{rbook.bid}'"
        cursor.execute(sql)
        con.commit()
        return cursor.rowcount
    except Exception as e:
        print(f"更新数据时发生错误: {e}")
        if con is not None:
            con.rollback()
        return 0
    finally:
        dbUtil.closeCon(con)

Conversion failed when converting the varchar value '2024-05-03' to data type int

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-21 23:56
    关注

    引自免费微信小程序:皆我百晓生

    在你提供的代码中,出现数据类型转换错误的原因在于SQL语句中的DATEADD函数。这个错误信息表明你试图将一个字符串(varchar)值转换为整数(int),但实际应该是处理日期类型。具体来说,在执行SQL查询时,数据库引擎尝试将returnDate字段的值与整数1进行加法操作,这导致了错误。

    解决这个问题的方法是在SQL语句中正确地处理日期类型。在SQL Server中,你应该使用DATEADD函数来添加时间间隔到日期上,而不是对日期进行算术运算。这里你需要修改数据库模块中的update方法,将DATEADD函数的第二个参数更改为 'week',而不是 '1',并将第一个参数设置为正确的日期列名。

    下面是修改后的update方法:

    def update(rbook: Rbook) -> int:
        """
        更新数据
        :param rbook:
        :return:
        """
        con = None
        try:
            con = dbUtil.getCon()
            cursor = con.cursor()
            # 更新数据
            sql = f"UPDATE borrow SET returnDate = DATEADD(week, 1, returnDate) WHERE bid = '{rbook.bid}'"
            cursor.execute(sql)
            con.commit()
            return cursor.rowcount
        except Exception as e:
            print(f"更新数据时发生错误: {e}")
            if con is not None:
                con.rollback()
            return 0
        finally:
            dbUtil.closeCon(con)
    

    这段代码做了以下更改:

    1. DATEADD(week, 1, '{rbook.returnDate}') 更改为 DATEADD(week, 1, returnDate),这样就不用再引用具体的字符串值,而是直接对returnDate列进行操作。
    2. 去掉了单引号包围returnDate,因为在SQL中,我们不需要对列名加引号。

    这样,当调用此函数时,它会正确地将一周添加到returnDate列上的日期,并且不会出现数据类型转换错误。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月22日
  • 创建了问题 4月21日