如何使用str_to_date(MySQL)正确解析两位数年份

时间:2017-08-03 03:11:13

标签: mysql date formatting 2-digit-year

我正在使用MySQL,我需要导入一个包含上个世纪DOB的表。所以这个人出生于1965年,但字符串中使用了两位数的年份格式。知道如何做到这一点吗?

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)

4 个答案:

答案 0 :(得分:1)

当我们开始使用{{3>时,您不能在1965年使用str_to_date(),因为1970年1月的第一个是所谓的Unix epoch }}

相反,请使用时代的UNIX time

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

在您的示例中,这将是:

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

可以看到 DATE_FORMAT

可以找到有关时代的更多信息SQLFiddle here,并且可以找到 here 的纪元转换器。

希望这有帮助! :)

答案 1 :(得分:0)

这是完整的SQL代码,可以获得我想要的东西。感谢@ObsidianAge提供的有用链接让我了解Unix时间。

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');

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

试试这个:

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;

有效。