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