Неверное значение даты при загрузке файла xlsx в таблицу с использованием py mysql и xlrd - PullRequest
0 голосов
/ 19 февраля 2020

(Очень) начинающий python пользователь здесь. Я пытаюсь загрузить файл xlsx в таблицу MySQL, используя библиотеки xlrd и py mysql python, и получаю сообщение об ошибке:

py mysql .err. InternalError: (1292, «Неверное значение даты:« 43500 »для столбца« invoice_date »в строке 1»)

Тип данных для invoice_date для моей таблицы - DATE. Формат для этого поля в моем файле xlsx также Дата. Все работает хорошо, если я изменяю тип данных таблицы на varchar, но я бы предпочел, чтобы данные загружались в мою таблицу как дата, а не конвертировались после факта. Есть идеи, почему я получаю эту ошибку? Похоже, что xlrd или py mysql читает '2/4/2019' в моем файле xlxs как '43500' , а mysql отклоняет его из-за несоответствия типа данных ,

import xlrd
import pymysql as MySQLdb

# Open workbook and define first sheet
book = xlrd.open_workbook("2019_Complete.xlsx")
sheet = book.sheet_by_index(0)

# MySQL connection
database = MySQLdb.connect (host="localhost", user="root",passwd="password", db="vendor")

# Get cursor, which is used to traverse the databse, line by line
cursor = database.cursor()

# INSERT INTO SQL query
query = """insert into table values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""

# Create a For loop to iterate through each row in the XLS file, starting at row 2 to skip the headers
for r in range(1, sheet.nrows):
    lp = sheet.cell(r,0).value
    pallet_lp = sheet.cell(r,1).value
    bol = sheet.cell(r,2).value
    invoice_date = sheet.cell(r,3).value
    date_received = sheet.cell(r,4).value
    date_repaired = sheet.cell(r,5).value
    time_in_repair = sheet.cell(r,6).value
    date_shipped = sheet.cell(r,7).value
    serial_number = sheet.cell(r,8).value
    upc = sheet.cell(r,9).value
    product_type = sheet.cell(r,10).value
    product_description = sheet.cell(r,11).value
    repair_code = sheet.cell(r,12).value
    condition = sheet.cell(r,13).value
    repair_cost = sheet.cell(r,14).value
    parts_cost = sheet.cell(r,15).value
    total_cost = sheet.cell(r,16).value
    repair_notes = sheet.cell(r,17).value
    repair_cap = sheet.cell(r,18).value
    complaint = sheet.cell(r,19).value
    delta = sheet.cell(r,20).value

    # Assign values from each row
    values = (lp, pallet_lp, bol, invoice_date, date_received, date_repaired, time_in_repair, date_shipped, serial_number, upc, product_type, product_description, repair_code, condition, repair_cost, parts_cost, total_cost, repair_notes, repair_cap, complaint, delta)

    # Execute sql Query
    cursor.execute(query, values)

# Close the cursor
cursor.close()

# Commit the transaction
database.commit()

# Close the database connection
database.close()

# Print results
print ("")
columns = str(sheet.ncols)
rows = str(sheet.nrows)
print ("I just imported " + columns + " columns and " + rows + " rows to MySQL!")

1 Ответ

1 голос
/ 20 февраля 2020

Вы можете увидеть этот ответ для более подробного объяснения, но в основном Excel обрабатывает даты как числа, относящиеся к 1899-12-31, и поэтому для преобразования значения даты в фактическую дату вам нужно преобразовать это число в дату в формате ISO, которую MySQL примет. Вы можете сделать это, используя date.fromordinal и date.isoformat. Например:

dval = 43500
d = date.fromordinal(dval + 693594)
print(d.isoformat())

Вывод:

2019-02-04
...