Какой тип данных использовать для дат 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, а не к определенному формату даты, хотя сам стандарт имеет стандартное форматирование для дат и раз.