2017-08-03 236 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'); 
相關問題