当从.txt文件加载数据时,为什么MySQL数据库中的一列正确设置了日期值的格式,而另一列却没有?

carvr3hs  于 2022-12-03  发布在  Mysql
关注(0)|答案(1)|浏览(100)

我有一个.txt文件,其中的字段由管道终止。该文件位于S3存储桶中,我编写了一个脚本将文件中的数据加载到MySQL数据库中。我的一切工作都正常,但我遇到了一个问题,我卡住了。该问题是在格式化日期值。
奇怪的是我有两列都是相同的日期格式,这是:日-月-年(01-Jan-96),并且最初它们都作为0000-00- 00加载到数据库中。我成功地设置了其中一列的格式,但似乎无法正确设置第二列的格式。在CREATE TABLE语句中,它们都是DATE值,且DEFAULT为NULL。因此,这两个列都是以相同的方式创建的,并且在my .txt文件中这两个列的格式也相同。
当在LOAD DATA LOCAL INFILE语句中列出列名时,我对这两个列都使用了变量,并且日期的格式在SET语句中完成。
这是我所尝试的,以及很多的变化。

import mysql.connector

conn = mysql.connector.connect(
    user='username', password='pw', host='hostname', database='db', allow_local_infile=True
)

cursor = conn.cursor()

sql = """LOAD DATA LOCAL INFILE '/myfile.txt'
INTO TABLE tablename
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(column1, column2, @s_date_value, column4, @o_date_value, column5)
SET
    S_DATE = date_format(str_to_date(@s_date_value, '%d-%b-%y'), '%d-%b-%y'),
    O_DATE = date_format(str_to_date(@o_date_value, '%d-%b-%y'), '%d-%b-%y');"""

cursor.execute(sql)
conn.commit()

conn.close()

因此,S_DATE正确加载,这样写的O_DATE将加载为0000-00-00。如果我写以O_DATE开头的行,而不写date_format,我就能以YYYY-MM-DD格式加载实际日期,如下所示:

O_DATE = str_to_date(@o_date_value, '%d-%b-%y');"""

如果我只使用date_format编写它,我会得到所有NULL值,如下所示:

O_DATE = date_format(@o_date_value, '%d-%b-%y');"""

有一点我不明白,为什么我还需要str_to_date,因为它们首先是作为DATE值创建的。但是,date_format和str_to_date的组合对S_DATE有效。
我也考虑过这个问题与在SET语句中列出多个查询有关,但我似乎通过研究发现这是可以接受的,我尝试在SET语句中只包含O_DATE而不包含S_DATE,我得到了相同的结果。
我也尝试过在UPDATE语句中将它们组合起来,并使用cursor.execute()执行它。我尝试过的另一个解决方案是使用regex编写SET语句,但也不成功。
这是我的第一篇关于堆栈溢出的文章,如果需要更多的信息,请告诉我。如果有人能提供一些帮助,我将非常感谢!

x8goxv8g

x8goxv8g1#

我可以通过创建一个ALTER语句来解决这个问题,首先将该列设置为TEXT,然后像处理S_DATE那样将date_format和str_to_date组合在一起。但我仍然不确定为什么我必须对一个列而不是另一个列这样做。

相关问题