Какой тип данных использовать для дат ISO 8601?

Я перепроектирую базу данных, которая в настоящее время импортирует даты ISO 8601 в формате 2012-10-27T07:30:38+00:00 в поле varchar. Текущая база данных размещена на сервере MySQL 5.5.

при поиске документации и различных сообщений SO я не нашел окончательного ответа на то, какой тип данных я должен использовать в MySQL для этой цели. Ближайший пост: MySQL insert to DATETIME: безопасно ли использовать формат ISO:: 8601? где он обеспечивает работу вокруг видов, однако это нежелательный вариант.

документация 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

какие состояния " возможные значения для первого и второго аргументов приводят к нескольким возможным строкам формата (для используемых спецификаторов см. стол в DATE_FORMAT() описание функция). Формат ISO относится к ISO 9075, а не к ISO 8601."

сейчас в документации 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, или я должен рассматривать базу данных с родной поддержка?

-- Edit--

попытка вставить метку времени примера выше в столбец 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 ответов


Не храните значения даты или метки времени в столбце varchar. У вас нет способа обеспечить сохранение правильного значения (никто не мешает вам хранить 2012-02-31 28:99:70 там.

Если вам не нужна часть времени, используйте date тип данных (доступен в MySQL и PostgreSQL) если вам нужно время, используйте timestamp (или datetime в MySQL) тип данных.

форматирование значений должно выполняться в вашем интерфейсе или если вам абсолютно необходимо сделать это в SQL, используя, например to_char () (или эквивалент в MySQL) при получении значений.

снова: никогда не храните даты или метки времени в varchar (так же, как вы никогда не должны хранить действительные числа в столбце varchar).

вот обзор MySQL для типов данных даты/времени:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html

вот обзор PostgreSQL для типов данных date7time: http://www.postgresql.org/docs/current/static/datatype-datetime.html

редактировать

если вы обеспокоены литеральным форматом. Обе СУБД поддерживают стандартные литералы даты и метки времени ANSI:

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

SQLFiddle для PostgreSQL:http://sqlfiddle.com#!12 / cdd39/1

обратите внимание на ключевые слова timestamp и date перед буквальным символом.

изменить 2

кажется MySQL не может вставить такое значение, хотя он можете используйте этот литерал в инструкции SELECT:


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 |
+---------------------+

еще одно преимущество использования datetime или timestamp для хранения. В phpMyAdmin или phpPgAdmin значение отображается в виде строки, например 2015-01-22 11:13:42. Поэтому гораздо проще найти дату, как если бы она хранилась как varchar или int.

и я думаю, что важно, какой часовой пояс имеет сервер. Я вижу, что метка времени в MySql не отображает микросекунды. Я знаю, что MySQL использует UTC-время для меток времени и полей datetime. Поэтому укажите значения в виде метки времени UTC.


на ISO 8601 формат даты, "гггг-ММ-ДД", - это то, что MySQL излучает внутренне при отображении значений даты, и он может импортировать их точно так же.

Они предпочтительнее дат "американского стиля", таких как" MM/DD/YY", где слишком много двусмысленности для автоматического разрешения.

ISO 9075, по-видимому, относится ко всему стандарту SQL, а не к определенному формату даты, хотя сам стандарт имеет стандартное форматирование для дат и раз.