3

Delphi TDateTImeを保存する必要がありますか、それとも最初にUnixタイムスタンプに変換する必要がありますか?それとも、文字列としてのmayeb eeven?

MySqlで列を宣言するにはどうすればよいですか?Double、またはDateTime(またはUnixタイムスタンプを使用する場合は整数)として?

Whtaは「正しい」ですか、または「yyyy mm dd hh:mm:ss」(または同様の)の文字列を表示し、2つの値を比較して経過時間を取得できるようにする場合、最も簡単な方法は何ですか?

ところで、このプログラムは1つのタイムゾーンでのみ使用されます。夏時間はありません。

私は混乱していて、これがどこでも議論されているのを見つけることができないようです。役立つURLはありますか?

4

6 に答える 6

9
  1. Delphi TDateTImeを保存する必要がありますか、それとも最初にUnixタイムスタンプに変換する必要がありますか?

    通常、どちらも実行しないでください。データベース層のデータ型は、それ自体で(可能な限り)意味があり、アプリケーションに依存して解釈されないようにする必要があります。@Jim DeLaHuntが言うように、これにより、データベースは必要に応じてSQLからそれらを簡単に操作/解釈できます(また、将来、別のアプリケーションコードベースから同じデータに簡単にアクセスできるようになります)。

    MySQLには5つの時間タイプがあり、そのうちの2つだけが日付と時刻の両方を格納します:DATETIMETIMESTAMP

    他の人がほのめかしているように、違いはタイムゾーンを保存するかどうかにあります-私はそれを見るのはかなり紛らわしい方法だと思いますが:

    • TIMESTAMPセッションのtime_zone変数を使用して入力をUTCタイムスタンプに変換し、再び出力に戻します。これは、正確な瞬間を指定するのに役立ちます。

    • DATETIMEカレンダーや時計の写真を撮るのと同じように、タイムゾーンに関係なく日付と時刻を保存するだけです。これは、同じ現地時間でグローバルに発生するイベントを指定する場合に便利です。

  2. MySqlで列を宣言するにはどうすればよいですか?Double、またはDateTime(またはUnixタイムスタンプを使用する場合は整数)として?

    他の列を宣言するのと同じように、列名の後に関連するデータ型を指定します。

    自動更新TIMESTAMPなどの追加機能があることに注意してください。必要に応じて、列宣言で無効にすることができます。

  3. Whtaは「正しい」ですか、または「yyyy mm dd hh:mm:ss」(または同様の)の文字列を表示し、2つの値を比較して経過時間を取得できるようにする場合、最も簡単な方法は何ですか?

    上記の時間タイプのいずれかを使用すると、これらすべてを実行できます(必要に応じて日付関数を使用)。TIMESTAMPおよびDATETIMEtypesのデフォルトの出力は、'YYYY-MM-DD HH:MM:SS'フォーマットの文字列です。

    特に、2つの値を比較することによる「経過時間」は、たとえばMySQLのTIMEDIFF()関数を使用して取得できます。

    SELECT TIMEDIFF(end, start) AS elapsed
    FROM   my_table
    WHERE  ...
    
于 2012-11-20T08:38:39.387 に答える
4

MySQLには、SQLの日付関数(年、月など)を使用できるため、推奨されるネイティブの日付形式が必要です。

データベーステーブルの1つに、Delphi日時として定義されているフィールドがあります。振り返ってみると、このフィールドでフィルタリングしたり値を表示したりするのは非常に難しいため、これは間違いでした。これらのアクションは両方とも、データベースではなく、呼び出し側プログラムで特別な処理を必要とします。

于 2012-11-20T08:31:30.907 に答える
2

MySQLに必要に応じて、つまり日時フィールドとして日付/時刻を処理させます。それは巨大な範囲を持っています(エポックに制限されていません)。

ここを参照してください:http://dev.mysql.com/doc/refman/5.0/en/datetime.html

于 2012-11-20T08:31:07.190 に答える
1

このリンクはあなたに役立つかもしれません。タイムゾーンを使用するかどうかによって異なりますが、現在は必要ない場合でも、将来使用できないかどうかを再検討してください。

DATETIMEを使用します。人間が読みやすいです。

于 2012-11-20T08:29:32.960 に答える
1

MySQLの日付と時刻のタイプに関するすべては、MySQLリファレンスマニュアルの11.3で読むことができます。日付と時刻のタイプおよび12.7の関数について。日付と時刻の関数

MySQLとSQLServerでの私の経験は、Delphi自体ではありませんが、データベースの日付と時刻の形式で日付と時刻の値を格納するのに十分なサービスを提供しているということです。これにより、データベースの日付と時刻の関数を使用し、日付と時刻の機能の最適化された実装を利用できます。日時の値をDoubleまたはIntegerUnixタイムスタンプなどの一般的なものとして格納する場合、最適化が不足し、独自の日付と時刻の関数を実装する必要があります。

OPの編集された質問に基づいて更新します。

このDateFormat()関数は、のようなフォーマット文字列を使用して、「yyyy mm dd hh:mm:ss」のような文字列を提供できます"%Y %m %d %k:%i:%s"

このTimeDiff()関数は、2つの日時値の差を示す時間間隔タイプを提供します。

于 2012-11-20T08:33:02.907 に答える
0

mysqlで日時を保存するための最良の方法を説明する投稿がいくつかあります。

MySQL IntegervsDateTimeインデックス および MySQLDATETIMEvs TIMESTAMPvsINTパフォーマンスとMyISAMによるベンチマーク

日時をUnixタイムスタンプに変換し、整数として保存することにした場合

次の点に注意してください。

  • Delphi関数 DateTimeToUnix(StrToDateTime( '2013-11-22 16:34:45')); 会話にローカルタイムゾーン
    を 使用します

  • MYSQL関数 UNIX_TIMESTAMP( '2013-11-22 16:34:45')会話にGMTタイムゾーンを使用します

于 2013-11-22T15:55:29.097 に答える