1

我正在使用 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

4 回答 4

2

您不能使用str_to_date()1965 年,因为 1970 年 1 月的第一天是所谓的 Unix纪元,当我们开始使用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工作。

更多关于纪元的信息可以在这里找到,一个纪元转换器可以在这里找到。

希望这可以帮助!:)

于 2017-08-03T03:30:28.380 回答
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');
于 2017-08-03T16:10:51.000 回答
0

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

SELECT SUBSTR('09-JAN-65',-2), IF( SUBSTR( '09-JAN-65',-2) > 19, 'date is 1900+', 'date is 2000+' ) FROM t;
于 2019-02-03T15:10:40.517 回答
-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;

有用。

于 2018-06-09T22:25:57.053 回答