2017-08-03 5 views
1

私はMySQLを使用しており、前世紀のDOBを持つテーブルをインポートする必要があります。その人は1965年に生まれましたが、2桁の年形式が文字列に使用されています。どのようにこの権利を取得するための任意のアイデア?我々はUNIX timeを使用し始めたときstr_to_date(MySQL)を使用して2桁の年を正しく解析する方法

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));'は '1994年を返します –

+0

MySQLはそれがするために設計されていることをやっています。 https://dev.mysql.com/doc/refman/5.5/en/two-digit-years.html世紀を提供する必要があります。 – GurV

答えて

2

あなたは、1970年1月の最初として、いわゆるUnixのepochで、1965年にstr_to_date()を使用することはできません。代わりに

、エポックから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

* 1970年以前にSQL時間が存在しませんでした* - それが理由ですか? – 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'); 
関連する問題