2017-08-03 235 views
1

我正在使用MySQL,并且需要导入一个具有上个世纪DOB的表。所以这个人诞生于1965年,但是在字符串中使用了两位数的年份格式。任何想法如何得到这个权利?如何使用str_to_date(MySQL)正确解析两位数年份

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) 
+0

尝试'makedate'函数。看到这个'SELECT YEAR(MAKEDATE(94,1));'returns'1994' –

+0

MySQL正在做它设计的目的。 https://dev.mysql.com/doc/refman/5.5/en/two-digit-years.html你需要提供世纪。 – GurV

回答

2

不能使用str_to_date()与上年的1965年,作为第一个1970年1月的是所谓的Unix epoch,当我们开始使用UNIX time

相反,使用DATE_FORMAT从一个时代:

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

由此可以看出,在SQLFiddle here工作。

关于时代的更多信息可以在here找到,并且可以找到时代转换器here

希望这会有所帮助! :)

+0

* SQL时间在1970年以前不存在* - 您确定这是原因吗? – GurV

+0

稍微改进了1970年前使用时间的解释。 –

+0

在UNIX历元之前的日期,时元值可能为负数。这不像它不能支持。这就是MySQL的设计。考虑到这个世纪是未知的,MySQL需要猜测。在这种情况下,有规则可以猜测 - https://dev.mysql.com/doc/refman/5.5/en/two-digit-years.html – GurV

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'); 
相关问题