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

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

我正在使用 MySQL,我需要导入具有上个世纪 DOB 的 table。所以此人出生于 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)

您不能将 str_to_date() 与 1965 年一起使用,因为 1970 年 1 月的第一天是所谓的 Unix epoch, when we started using 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, and an epoch converter can be found here

希望这对您有所帮助! :)

这里是完整的 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');

试试这个:

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;

有效。

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

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