我正在使用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)
答案 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;
有效。