简体   繁体   中英

how to use str_to_date (MySQL) to parse two-digit year correctly

I'm using MySQL and I need to import a table that has DOBs from the last century. So the person was born in 1965, but the two-digit year format is used in the string. Any idea how to get this right?

mysql> select str_to_date('09-JAN-65', '%d-%b-%y');
+--------------------------------------+
| str_to_date('09-JAN-65', '%d-%b-%y') |
+--------------------------------------+
| 2065-01-09                           |
+--------------------------------------+
1 row in set (0.01 sec)

You can't use str_to_date() with a year of 1965, as the first of January 1970 is the so called Unix epoch , when we started using UNIX time .

Instead, use DATE_FORMAT from an epoch:

SELECT DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval [timestamp] second), '%Y-%m-%d');

In your example, this would be:

SELECT DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval -157075200 second), '%Y-%m-%d');

This can be seen working at SQLFiddle here .

More information regarding epochs can be found here , and an epoch converter can be found here .

Hope this helps! :)

Here's the complete SQL code to get what I wanted. Thanks to @ObsidianAge for helpful links making me aware of Unix time.

SELECT DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval TIMESTAMPDIFF(second,FROM_UNIXTIME(0), str_to_date(CONCAT('19', SUBSTRING('09-JAN-65',8,2), '-', SUBSTRING('09-JAN-65',4,3), '-', SUBSTRING('09-JAN-65',1,2)), '%Y-%b-%d')) second), '%Y-%m-%d');

我检查年份值是否高于当前年份,如果是,则为1900+,如果不是,则为2000+:

SELECT SUBSTR('09-JAN-65',-2), IF( SUBSTR( '09-JAN-65',-2) > 19, 'date is 1900+', 'date is 2000+' ) FROM t;

Try this:

SELECT Case when convert(SUBSTR('09-JAN-65',8,2), unsigned) < 70 
then str_to_date(CONCAT(SUBSTR('09-JAN-65',1,7), 19, SUBSTR('09-JAN-65',8,2)), '%d-%b-%Y') 
else str_to_date('09-JAN-65', '%d-%b-%y') END;

It works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM