0

PHPでcsvファイルから日時を読み取り、mysqlデータベースに保存するタスクがあります。csvファイルには2つの日時の形式があります。1つ目は、、2つDD/MM/YYYY HH:mm:ss AM/PM目はMM-DD-YYYY HH:mm:ss AM/PMです。その後、日時が特定の期間にあるため、いくつかの行を選択する必要があります。

少し混乱しているようです。私の脳にはいくつかの質問があります:

  1. それらを保存するためにmysqlテーブルにvarcharタイプを設定するのは簡単です。ただし、最初に文字列を日時に変換し、その間のデータが特別な期間にあるかどうかを確認する必要があるため、後でいくつかの行を選択するのは困難です。

  2. 別の解決策は、データベースに保存する前に、PHPによってこれらの日時を文字列から日時に変換することです。そうすれば、後でデータを簡単に選択できます。しかし、最初のステップも少し複雑です。

誰かがこの質問について良い考えを持っているかどうか、または同様の問題の経験があるかどうかはわかりません。

4

1 に答える 1

1

まず、データベースに日付や日時を文字列として保存しないでください。

一度もない。

わかった?

それらは常にデータベースの組み込み型dateまたはdatetimeデータ型に変換する必要があります。

これを怠ると、後で非常に激しく噛みつきます。たとえば、文字列として保存されている場合、特にさまざまな形式で保存されている場合に、データベースに日付順に並べ替えさせることを想像してみてください。データベースに日付がある場合、特定の日付以降またはそれ以前のエントリに基づいてクエリを実行する必要があります。そのようなことをする必要がないのであれば、そもそも日付を保存する意味があまりないので、まだ依頼されていない場合でも、それは当然のことと考えてください。後で求められるということです。したがって、常にvarcharとしてではなく、常に正しいデータ型で格納してください。

次に、対処するよう求められたフォーマットの混合。

これは狂気です。

私はPHPのstrtotime()機能を嫌い、嫌います。それは遅く、いくつかの不幸な癖があり、一般的に過去の遺産と見なされるべきであり、使用されるべきではありません. ただし、この場合、それはあなたの助けになるかもしれません。

strtotime()不明な形式の日付文字列を受け入れて解析し、正しいタイムスタンプを出力するように設計されています。dd-mm-yyyy明らかに、とフォーマットの両方の存在に対処する必要がありmm-dd-yyyyます。これは、区切り文字を見て、2 つのうちどちらを意味するかを推測することによって行われます。

日付文字列が区切り文字としてスラッシュを使用している場合、形式はmm/dd/yyyy. ダッシュを使用する場合は、dd-mm-yyyy. strtotime()これは、通常の使用でこのような痛みを伴う小さな癖の 1 つです。しかし、ここにいるのはあなたの友達です。

それが機能する方法は、実際には、質問で指定した形式とは正反対です。しかし、それはあなたを助けるのに十分なはずです。入力文字列のスラッシュとダッシュを切り替えて結果を渡すとstrtotime()、質問で説明した方法に従って、すべての場合に正しいタイムスタンプが生成されます。

その後、それらをデータベースに正しく保存するのに十分簡単でなければなりません。

ただし、これを非常に徹底的にテストすることを強くお勧めします。そして、それがどこかで途切れても驚かない。一貫性のない形式でデータが供給されている場合、それが一貫して一貫していないことを保証する方法は実際にはありません。あなたのプログラムは基本的に、悪いデータに対して最善を尽くす必要があります。

また、入力データの品質について深刻な問題を提起する必要もあります。この状況では、確実に動作するプログラムは期待できません。それを提供している人に、それが十分ではないことを明確にしてください。不正なデータが原因でプログラムが壊れた場合、それは彼らのせいであり、あなたのせいではありません。

于 2012-08-30T21:59:03.343 に答える