search

Home  >  Q&A  >  body text

How to load date data using LOAD DATA in MySQL

<p>The default date format for a date column in MySQL is <code>YYYY-MM-DD HH:MM:SS</code>. </p> <p>The data file I'm trying to load has a date field in the format of <code>DD-MON-YY HH:MM:SS</code>. When I load this file using the <code>LOAD DATA</code> command, the database gets confused and sets all date entries to <code>0000-00-00 00:00:00</code> or NULL . </p> <p>This is my test using the <code>STR_TO_DATE</code> option but it doesn't work.</p> <p><strong>测试文件(test_temp.csv)</strong></p> <pre class="brush:php;toolbar:false;">c1, c2 07-JUN-12 22:50:19, "abc" 07-JUN-13 22:50:19, "bcd"</pre> <p><strong>测试表(temp_test)</strong></p> <pre class="brush:php;toolbar:false;">describe temp_test; ------- ------------- ------ ----- --------- ------- | Field | Type | Null | Key | Default | Extra | ------- ------------- ------ ----- --------- ------- | c1 | datetime | YES | | NULL | | | c2 | varchar(10) | YES | | NULL | | ------- ------------- ------ ----- --------- ------- </pre> <p><strong>数据加载命令:</strong></p> <pre class="brush:php;toolbar:false;">load data infile '/var/lib/mysql/DataSet-1/temp_test.csv' ignore into table temp_test fields terminated by ',' enclosed by '"' lines terminated by 'rn' ignore 1 lines (@var_c1,c2) set c1 = STR_TO_DATE(@var_c1,'%d-%b-%y %h:%i:%s');</pre> <p><strong>输出</strong></p> <pre class="brush:php;toolbar:false;">Query OK, 2 rows affected, 2 warnings (0.00 sec) Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 MySQL> show warnings; ------- ------ ------------------------------------------------------------------------- | Level | Code | Message | ------- ------ ------------------------------------------------------------------------- | Error | 1411 | Incorrect datetime value: '07-JUN-12 22:50:19' for function str_to_date | | Error | 1411 | Incorrect datetime value: '07-JUN-13 22:50:19' for function str_to_date | ------- ------ ------------------------------------------------------------------------- MySQL> select * from temp_test; ------ ------ | c1 | c2 | ------ ------ | NULL | abc | | NULL | bcd | ------ ------ </pre> <p>问题出在:</p> <ol> <li>输入日期列(应该是<code>07-JUN-12</code>还是<code>07-Jun-12</code>)或</li> <li>我的格式字符串(<code>%d-%b-%y</code>)或</li> <li>其他原因?</li> </ol><p><br /></p>
P粉738046172P粉738046172550 days ago568

reply all(1)I'll reply

  • P粉852578075

    P粉8525780752023-08-23 09:28:32

    Your STR_TO_DATE() format string is invalid. The hours in your sample data use the 24-hour clock (%H or %k), not the 12-hour clock (%h). You can see all possible date format specifiers here.

    Will

    %d-%b-%y %h:%i:%s

    change into

    %d-%b-%y %H:%i:%s
             ^^

    Your statement might look like this

    LOAD DATA INFILE '/path/to/temp_test.csv'
    IGNORE INTO TABLE temp_test
      FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
      LINES TERMINATED BY '\r\n' -- or '\n'
      IGNORE 1 LINES
    (@c1, c2)
    SET c1 = STR_TO_DATE(@c1,'%d-%b-%y %H:%i:%s');

    After loading using your sample data

    mysql> select * from temp_test;
    +---------------------+------+
    | c1                  | c2   |
    +---------------------+------+
    | 2012-06-07 22:50:19 | abc  |
    | 2013-06-07 22:50:19 | bcd  |
    +---------------------+------+
    2 rows in set (0.00 sec)
    

    reply
    0
  • Cancelreply