12

現在 ISO 8601 の日付を の形式で2012-10-27T07:30:38+00:00varchar フィールドにインポートするデータベースを再設計しています。現在のデータベースは MySQL 5.5 サーバーでホストされています。

ドキュメントやさまざまな SO 投稿を検索しても、この目的のために MySQL でどのデータ型を使用する必要があるかについての決定的な答えは見つかりませんでした。最も近い投稿は次のとおりです 。MySQL insert to DATETIME: is it safe to use ISO::8601 format? ある種の回避策を提供しますが、これは望ましいオプションではありません。

MySQL のドキュメント ( http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html ) には記載されておらず、公式ドキュメントで見つけることができる唯一のリファレンスはページにあります: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

「最初と 2 番目の引数の可能な値は、いくつかの可能な形式文字列になります (使用される指定子については、DATE_FORMAT() 関数の説明の表を参照してください)。ISO 形式は、ISO 8601 ではなく、ISO 9075 を参照します。」

現在、PostgreSQL のドキュメントでは特に ISO8601 について言及されています ( http://www.postgresql.org/docs/9.2/static/datetime-keywords.htmlおよびhttp://www.postgresql.org/docs/9.2/static/datatype-datetime. html ) 私の質問に私を導く:

MySQL は ISO 8601 を正しくサポートしていますか、それともネイティブ サポートのデータベースを検討する必要がありますか?

- 編集 -

上記のタイム スタンプの例を datetime 列に挿入しようとすると、次のエラーが発生します。

10:55:55    insert into test(date1) values('2012-10-27T07:30:38+00:00') Error Code: 1292. Incorrect datetime value: '2012-10-27T07:30:38+00:00' for column 'date1' at row 1 0.047 sec
4

4 に答える 4

9

日付またはタイムスタンプの値を varchar 列に格納しないでください。正しい値が格納されていることを確認する方法はありません (2012-02-31 28:99:70そこに格納することを誰も妨げません。

時間の部分が必要ない場合は、dateデータ型 (MySQL および PostgreSQL で使用可能) を使用します。時間が必要な場合はtimestamp(またはdatetimeMySQL で) データ型を使用します。

値のフォーマットは、フロントエンドで行うか、値を取得するときに to_char() (または MySQL の同等のもの) を使用して SQL で絶対に行う必要がある場合に行う必要があります。

繰り返しますが、日付やタイムスタンプを varchar に格納しないでください (varchar 列に実数を格納しないように)。

日付/時刻データ型の MySQL の概要は次のとおりです。http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html

date7time データ型の PostgreSQL の概要は次のとおりです: http://www.postgresql.org/docs/current/static/datatype-datetime.html

編集

リテラル形式が気になる場合。どちらの DBMS も、標準の ANSI 日付およびタイムスタンプ リテラルをサポートしています。

insert into some_table 
   (ts_column, date_column)
values
   (timestamp '2012-10-27T07:30:38+00:00', DATE '2012-12-30');

PostgreSQL 用 SQLFiddle: http://sqlfiddle.com/#!12/cdd39/1

文字リテラルの前のキーワードtimestampとに注意してください。date

編集 2

SELECT ステートメントでそのリテラルを使用できますが、 MySQL はそのような値を挿入できないようです。

于 2012-10-30T15:03:06.233 に答える
2

Postgresqlはそのフォーマットを処理できます:

それなし

select timestamp '2012-10-27T07:30:38+00:00';
      timestamp      
---------------------
 2012-10-27 07:30:38

またはタイムゾーン付き:

select timestamptz '2012-10-27T07:30:38+00:00';
      timestamptz       
------------------------
 2012-10-27 05:30:38-02

MySQLはタイムゾーンの部分をあまり気にしていないようですが、次のようになります。

create table t (ts timestamp);

insert into t (ts) values
('2012-10-27T07:30:38+03:00'),
('2012-10-27T07:30:38-02:00');

select * from t;
+---------------------+
| ts                  |
+---------------------+
| 2012-10-27 07:30:38 |
| 2012-10-27 07:30:38 |
+---------------------+
于 2012-10-30T15:08:17.950 に答える
1

保存に日時またはタイムスタンプを使用するもう1つの利点。phpMyAdmin または phpPgAdmin では、値は文字列として表示されます (例: 2015-01-22 11:13:42)。そのため、日付が varchar または int として格納されているかのように、日付を見つけるのははるかに簡単です。

そして、サーバーがどのタイムゾーンを持っているかが重要だと思います。MySql のタイムスタンプがマイクロ秒を表示しないことがわかりました。MySQL がタイムスタンプと日時フィールドに UTC-Time を使用していることは知っています。そのため、値を UTC タイムスタンプとして提供します。

于 2015-01-22T11:13:42.990 に答える
1

ISO 8601日付形式" YYYY-MM-DD" は、日付値を表示するときに MySQL が内部的に発行するものであり、それらをまったく同じようにインポートできます。

これらは、あいまいさが多すぎて自動的に解決できない「MM/DD/YY」などの「アメリカン スタイル」の日付よりも適しています。

ISO 9075 は、特定の日付形式ではなく、SQL 標準全体を参照しているように見えますが、標準自体には日付と時刻の標準形式があります。

于 2012-10-30T14:52:11.577 に答える