You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5使用QDateTime插入MySQL timestamp(6)报Error 1292错误求解决

解决MySQL Error 1292: Incorrect datetime value 问题

你遇到的核心问题是直接将PyQt的QDateTime/QDate对象传入MySQL查询,MySQLdb无法自动把这些对象转换成timestamp(6)或date字段要求的格式。我们需要手动把Qt日期时间对象转成MySQL支持的字符串格式,同时修正代码里的其他小问题。

关键修改点

  • 针对timestamp(6)类型的inv_date字段:要转换成带6位微秒的日期时间字符串,格式为yyyy-MM-dd hh:mm:ss.zzzzzz
  • 针对date类型的inv_expiry、inv_due_date字段:转换成yyyy-MM-dd格式的字符串
  • 修正文本框和组合框的取值错误:QTextEdit需用toPlainText()获取文本,组合框若要存选项文本而非索引,要用currentText()

修改后的click_save方法代码

@pyqtSlot()
def click_save(self):
    con = mdb.connect(user='root', passwd='ilovemy1god', host='localhost', database='A3A_SIS')
    with con:
        cur = con.cursor()
        # 转换Qt日期时间对象为MySQL支持的字符串格式
        inv_date_str = self.dt_inv_datetime.dateTime().toString("yyyy-MM-dd hh:mm:ss.zzzzzz")
        inv_expiry_str = self.de_inv_expiry.date().toString("yyyy-MM-dd")
        inv_duedate_str = self.de_inv_duedate.date().toString("yyyy-MM-dd")
        
        # 获取正确的文本和选项值
        item_desc = self.te_inv_itemdesc.toPlainText()
        prod_name = self.cb_inv_prodname.currentText()
        pay_terms = self.cb_inv_terms.currentText()
        inv_status = self.cb_inv_status.currentText()
        
        cur.execute('''INSERT INTO inv_delivery(inv_date, inv_invoice_num, inv_sup_name, inv_prod_name, inv_prod_itemdesc, inv_batchnum, inv_expiry, inv_quantity, inv_list_price, inv_discount, inv_net_price, inv_total_amount, inv_pay_terms, inv_due_date, inv_status) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)''',
                    (
                        inv_date_str,
                        self.le_inv_invnum.text(),
                        self.le_inv_supplier.text(),
                        prod_name,
                        item_desc,
                        self.le_inv_batch.text(),
                        inv_expiry_str,
                        self.le_inv_quantity.text(),
                        self.le_inv_listprice.text(),
                        self.le_inv_discount.text(),
                        self.le_inv_netprice.text(),
                        self.le_inv_totalamount.text(),
                        pay_terms,
                        inv_duedate_str,
                        inv_status
                    )
                  )
        cur.close()
        QMessageBox.information(self, "Connection", "Data Inserted Successfully")
        # 重置表单(保留你原有的逻辑)
        self.dt_inv_datetime.setDateTime(QtCore.QDateTime.currentDateTime())
        self.le_inv_invnum.setText('')
        self.le_inv_supplier.setText('')
        self.cb_inv_prodname.setItemText(0,'Eprex 4kiu')
        self.te_inv_itemdesc.setText('')
        self.le_inv_batch.setText('')
        self.de_inv_expiry.setDate(QtCore.QDate.currentDate())
        self.le_inv_quantity.setText('')
        self.le_inv_listprice.setText('')
        self.le_inv_discount.setText('')
        self.le_inv_netprice.setText('')
        self.le_inv_totalamount.setText('')
        self.cb_inv_terms.setItemText(0,'COD')
        self.de_inv_duedate.setDate(QtCore.QDate.currentDate())
        self.cb_inv_status.setItemText(0,'Fully Paid')
        self.initWindow()

详细说明

  1. 日期时间格式适配:

    • QDateTime.toString("yyyy-MM-dd hh:mm:ss.zzzzzz")生成的字符串完美匹配MySQL timestamp(6)的格式,包含6位微秒,完全符合字段要求。
    • QDate.toString("yyyy-MM-dd")生成标准日期字符串,适配MySQL的date类型字段。
  2. 其他取值修正:

    • self.te_inv_itemdesc.document()返回的是QTextDocument对象而非文本内容,改用toPlainText()才能获取到输入的纯文本。
    • 原来的currentIndex()会把组合框的选项索引(数字)存入数据库,如果你的inv_prod_name等字段是文本类型,用currentText()获取选项的显示文本,才能保证存入的数据符合业务预期。

这样修改后,就能彻底解决Error 1292的格式错误,同时保证所有字段的数据类型正确匹配。

内容的提问来源于stack exchange,提问作者Anthony Gaupo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:15:53