2011-11-15 14 views
1

私は、古いものから多くの不一致があるWebアプリケーションを再構築しています。すべてのデータを古いデータベースから新しい構造に移行する必要があります。非形式的な日付間の変換(スラッシュ/ダッシュに変更)

古いデータベースでは、日付はVARCHARとしてMySQL DBに保存されました。 私たちはイギリスを拠点としているので、日付はDD/MM/YYYYの形式で書かれています。これらの日付をMySQLのネイティブDATE()形式に変換する必要があります。

問題はこれです - 彼らは「ヨーロッパの」フォーマットされていると仮定すると-軍PHP - PHPの彼らはもともと/ではなく-で分割されたため、日付が(MM/DD/YYYY「)アメリカの」形式であると仮定するとデフォルト。

私はそれらを変換するために、これまでにこれをやっている:$query->row('startdate')日付を格納した古いデータベース内の列です

$start_date = date('Y-m-d', strtotime($query->row('startdate'))); 

。問題は、最初にすべて21/03/199421-03-1994に切り替える必要があります。

どうすればいいですか?このような

+3

最初にデータベース内でVARCHARデータを正規化してから、フィールド型をDATEフィールドに変換すると完了です。 IMHOのためにPHPを使用する必要はありません。 – hakre

+0

ありがとう@hakre - これは、私たちがフォーマットして再挿入する必要がある膨大な量の小さなチャンクであり、これは比較的重要でないものの壮大なスキームである。私たちは、PHPスクリプトのコレクションを使って約50のテーブルを移行しています。これはフォーマットに問題があります。面白いことに、他の場所に保存されている他の日付は、テキストとしても書式設定されています(スタッフは「次の金曜日」(!)を入力しました)、あるいは0000-00-00というテーブル全体... – Jack

+0

次に、各形式を検出します。 '%d /%d /%d /'が使われていること、 'DD/MM/YYYY'であることだけをどう知っていますか?最初に何が意味を持つのかを検出し、変換する必要があります。 PHPでこれを行うのは大丈夫でしょうが、すでに束を処理することができたら、おそらく2段階の戦略があなたの場合にはまだ有効です。自分のコード=自分のバグ。あなたが既存のツールに固執する限り、それは最も頻繁に最善の第一選択です。後で詳細を遅らせてください。また、http://dev.mysql.com/doc/refman/5.1/en/regexp.htmlを参照してください。 – hakre

答えて

6
$start_date = date('Y-m-d', strtotime(str_replace('/', '-', $query->row('startdate')))); 

それとも、より良いだけで、データベース内のデータを変更します。

---- EDIT ----

実際には、大佐シュラプネルはポイントを持っている...私はそれがYYYY-MM-DDですので、最新のニーズが同様に逆転するという事実を見落としだろう。元の日付がより良いクエリのようなものかもしれない形式DD/MM/YYYYであると仮定すると:

DATEに変換できる文字列に構成部品が逆になります
UPDATE `table` SET `date` = CONCAT(SUBSTRING(`date`, 7), '-', SUBSTRING(`date`, 4, 2), '-', SUBSTRING(`date`, 1, 2)) 

...それは勝ちましたたとえば、元の日付文字列が先行ゼロを使用しない場合は、かなりうまくいきます。1/6/2011 ...その場合は、少し賢明なことをする必要があります。

+0

あなたが提供したクエリは役に立ちません –

+0

@Col。 Shrapnel - 良い点、コンポーネントの順序を逆転するのを忘れた...更新されました。ありがとう。 – CD001

+0

ありがとう。今は正解と思われる。 –

0

使用str_replace

$start_date = date('Y-m-d', strtotime(str_replace('-','/',$query->row('startdate')))); 

もちろん醜いと迅速なソリューションである - YMMV。

UPDATE `table` SET `startdate` = REPLACE(`startdate`, '/', '-'); 

...そしてDATEを入力するフィールドを変換: -

まだ
0

、なぜ、データを解析し、それを正規化してから続行しませんか?例えば。 sscanfて:あなたは長い2つの移動の単なる最も単純な文字列操作を必要とするとき

$r = sscanf($varcharDate, '%d/%d/%d', $day, $month, $year); 
if ($r !== 3) 
{ 
    throw new Exception(sprintf('Invalid date format given: %s', $varcharDate)); 
} 
1

WHYすべてこの日付の時点のものでわざわざ?

$tmp = explode("/",$query->row('startdate')); 
$date = "$tmp[2]-$tmp[1]-$tmp[0]"; 

しかし、クリスが言ったように、あなたは、クエリに似た文字列操作を使用して、単一のSQLクエリを使用して、それを変換することができ、この操作でPHPが関与する必要がdno't。