10

免責事項:日付/時刻を表す最良の方法は、Unix タイムスタンプまたは PHP のDateTimeクラスと Oracle のDATEデータ型のいずれかであることを十分に認識しています。

邪魔にならないので、時間データだけを格納するのに最も適切なデータ型は (PHP と Oracle で) 何であるか疑問に思っています。日付コンポーネントの保存には興味がありません。時間だけ。

たとえば、employee典型的な勤務スケジュールを保存したいエンティティがあるとします。この従業員は、午前 8 時から午後 5 時まで勤務する可能性があります。これらの時刻には日付コンポーネントがありません。では、それらを格納して表すために何を使用する必要がありますか?

私が検討したオプション:

  1. 文字列として、標準形式 (おそらく 24 時間 HH:MM:SS+Z) を使用します。
  2. 0 <= n < 24 の範囲の数値として、小数部分は分/秒を表します (タイムゾーン情報を保存できませんか?)。
  3. などの正規化された/未使用の日付コンポーネントを持つPHPDateTimeおよび Oracleとして。DATE0001-01-01
  4. 上記と同じですが、代わりに Unix タイムスタンプのみを使用します (PHPintegerおよび Oracle TIMESTAMP)。

現在、上記の #3 を使用していますが、これらのデータ型を誤用しているように見えて、ちょっといらいらしています。ただし、私が知る限り、最高の使いやすさを提供します。比較と並べ替えは、PHP と Unix の両方で期待どおりにすべて機能し、タイムゾーン データを維持でき、データを表示するために必要な特別な操作は実際にはありません。

私は何かを見落としていますか、それとももっと適切な方法がありますか?

4

3 に答える 3

2

使用するオプション (3) が最適です。

Oracle には、時刻と日付を格納するための次の型があります。

  • 日にち
  • タイムスタンプ ((ローカル) タイムゾーン付き)
  • 間隔年月
  • 間隔日から秒

いつ開始し、いつ終了するかを気にするため、間隔データ型はオプションではありません。1 つの日付と 1 つの間隔を使用することもできますが、「間違った」日付がまだ 1 つあるため、これは矛盾しているように思えます。

あなたが言及した他のすべてのオプションは、あなたの側でより多くの作業を必要とし、おそらくネイティブの日付型と比較してパフォーマンスが低下する可能性があります.

オラクルの日付タイプの詳細: http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch4datetime.htm#i1005946

于 2012-07-29T10:20:40.027 に答える
2

日付がまったく必要ない場合、必要なのはinterval dayデータ型です。実際にそれを使用する必要はありませんでしたが、次のように動作するはずです:

interval day(0) to second(6)
于 2012-07-11T15:39:49.380 に答える
1

この質問に対する最も正しい答えは、データをどうしようと計画しているかに完全に依存していると思います。すべての作業を PHP で行い、データベースには何もしないことを計画している場合、データを保存する最良の方法は、PHP で行っていることを支援する形式でデータを取得する最も簡単な方法です。それは実際にそれらを文字列として保存している可能性があります。DBA にとっては恐ろしいことのように聞こえるかもしれませんが、データベースはアプリケーションにサービスを提供するためにあるということを覚えておく必要があります。一方、複雑なクエリを使用してデータベースで多くの比較を行っている場合は、クエリを最も効率的にする形式ですべてをデータベースに格納してください。

作業時間の計算などの負荷の高いタスクを実行している場合は、10 進形式に変換すると、最終的に時間:分に戻す前に計算が容易になる場合があります。データベースからデータを取得するときに 10 進数を前後に変換し、それを 10 進数に変換し、すべての計算を実行してから、それを実行して時刻形式に戻す単純な関数を作成できます。

日付を計算するときは unix タイムスタンプを使用すると便利ですが、時間を計算するときはおそらくそうではありません。タイムスタンプにタイムスタンプを非常に簡単に追加するなど、これを使用するといくつかの利点があるように見えますが、すべてをタイムスタンプに変換して計算するのは面倒で煩わしいことがわかったので、このシナリオは避けます。

要約すると、次のようになります。

  1. データを簡単に保存したいが、データを操作したくない場合は、文字列が効果的な方法になります。それらは読みやすく、確認しやすいです。それ以外の場合は、他のものを選択してください。
  2. 数値として計算すると、非常に簡単に計算できます。時刻/日付を 10 進数に変換し、すべてのハードヒットを実行してから、リアルタイム形式に戻して保存します。
  3. PHP の Datetime と Oracle の Date はどちらも便利で、Oracle と PHP にはデータを操作するための優れた関数が組み込まれていますが、最高の関数でさえ、小数を足し合わせるよりも難しい場合があります。データベースにデータを日付形式で保存することは、おそらく安全な考えだと思います。特に、クエリ内の列に基づいて計算を行いたい場合はそうです。PHP 内でそれらをどのように使用するかによって、それらをどのように使用するかが決まります。
  4. 私はすぐにオプション4を除外します。

編集: 時間の種類について友人と興味深いチャットをしました。注意すべきもう 1 つのことは、時間ベースのオブジェクトは、解決するよりも多くの問題を引き起こす場合があるということです。彼は、配達の日時を追跡するアプリケーションを検討していました。データは実際には datetime オブジェクトに格納されていましたが、ここに問題があります。トラックの配達時間は、特定の日と配達ウィンドウに設定されています。受け入れ可能な配達は、時間通り、または時間の 1 時間後までです。これは、トラックが午後 11 時 30 分に到着し、45 分後に到着したときに大混乱を引き起こしました。まだ許容範囲内ですが、翌日と表示されていました。もう 1 つの問題は、24 時間体制で午前 4 時に実際に稼働する配送センターで発生しました。

于 2012-08-02T10:27:12.990 に答える