Каковы плюсы и минусы различных типов полей даты / времени в MySQL? - PullRequest
2 голосов
/ 22 января 2009

Дата и время в MySQL могут быть сохранены как DATETIME, TIMESTAMP и INTEGER (количество секунд с 01.01.1970). Каковы преимущества и недостатки каждого из них, особенно при разработке под стеком LAMP?

Ответы [ 5 ]

5 голосов
/ 22 января 2009
  • TIMESTAMP хранится в проприетарном методе MySQL (хотя в основном это просто строка, состоящая из года, месяца, дня, часа, минут и секунд) и, кроме того, поле типа TIMESTAMP автоматически обновляется всякий раз, когда запись вставлено или изменено, и не указано явное значение поля:

    mysql> create table timestamp_test(
        id integer not null auto_increment primary key, 
        val varchar(100) not null default '', ts timestamp not null); 
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into timestamp_test (val) values ('foobar');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from timestamp_test;
    +----+--------+----------------+
    | id | val    | ts             |
    +----+--------+----------------+
    |  1 | foobar | 20090122174108 |
    +----+--------+----------------+
    1 row in set (0.00 sec)
    
    mysql> update timestamp_test set val = 'foo bar' where id = 1;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from timestamp_test;
    +----+---------+----------------+
    | id | val     | ts             |
    +----+---------+----------------+
    |  1 | foo bar | 20090122174123 |
    +----+---------+----------------+
    1 row in set (0.00 sec)
    
    mysql> 
    
  • DATETIME - это стандартный тип данных для дат и времени, который работает в сочетании с функциями даты и времени в MySQL. Я бы, наверное, использовал это на практике

  • Хранение дат в формате INTEGER не рекомендуется, поскольку вы открываете настоящую банку червей из-за интересных проблем, таких как часовые пояса, високосные годы и т. П. это поле.
3 голосов
/ 22 января 2009

Я бы сохранил данные, используя поля DATETIME или DATE в MySQL. По крайней мере, если вы собираетесь хранить значения дат до 2038 года: http://en.wikipedia.org/wiki/Year_2038_problem. Если вы работаете в системе, в которой целые числа хранятся по-разному, у вас может не быть этой проблемы.

Все еще легко сравнивать значения даты или даже временные метки.

SELECT * FROM myTable WHERE startDate > '2009-01-01'
SELECT * FROM myTable WHERE UNIX_TIMESTAMP(startDate) > 1232541482
2 голосов
/ 22 января 2009

Метка времени в MySQL может быть очень сложной. Если не объявлено тщательно, вы можете получить поле, которое автоматически меняет свое значение при каждом обновлении строки (даже если вы не обновляете его явно).

http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

2 голосов
/ 22 января 2009

Ну, я думаю, что следующее помогло бы уточнить.

Дата и время могут быть сохранены в поле DATETIME в mysql.

TIMESTAMP используется, если вы хотите поставить отметку времени при создании строки - поле будет автоматически заполнено при создании.

Использование целого числа для даты немного излишне, так как это, в сущности, то, что делает DATETIME, но выполняет все трудоемкие преобразования для вас.

Есть ли какая-то конкретная выгода или недостаток, о котором вы хотите узнать?

0 голосов
/ 22 января 2009

Если для отметки времени вам нужна точность в миллисекундах, вам нужно сохранить ее как целое число. Однако будьте осторожны, это может усложнить ситуацию.

...