MySQL / 5. Работа с датами и временем

Регистрация времени создания записи

Задача
Вы хотите сохранить время создания записи, что можно было бы сделать при помощи TIMESTAMP, но вам нужно, чтобы это значение не менялось при изменении записи, а тип TIMESTAMP не умеет хранить значение.

Решение
На самом деле он все умеет, нужно только включить в таблицу второй столбец TIMESTAMP, имеющий другие свойства.

Обсуждение
Если вам нужен столбец, который бы изначально устанавливался в момент создания записи, а затем больше не менялся, один TIMESTAMP – это не решение, так как он обновляется при изменении других столбцов записи. Создадим два столбца TIMESTAMP и воспользуемся тем, что второй не обладает специальными свойствами первого. Оба столбца можно установить в текущую дату и время в момент создания записи. Далее при каждом изменении других столбцов записи первый столбец TIMESTAMP будет обновляться, а второй будет продолжать хранить время создания записи. Рассмотрим такую таблицу:

CREATE TABLE tsdemo2
(
t_update TIMESTAMP, # время последнего изменения записи
t_create TIMESTAMP, # время создания записи
val INT
);

Создадим таблицу, затем вставим в нее запись, в которой оба столбца TIMESTAMP установлены в NULL (чтобы инициализировать их в текущую дату и время):

mysql> INSERT INTO tsdemo2 (t_update,t_create,val) VALUES(NULL,NULL,5);
mysql> SELECT * FROM tsdemo2;

+---------------------+---------------------+----+
|       t_update        |        t_create        | val |
+---------------------+---------------------+----+
| 20020715120003 | 20020715120003 |  5  |
+---------------------+---------------------+----+

После добавления записи изменим столбец val, затем проверим, произошло ли обновление столбца t_update и остался ли неизменным и равным времени создания записи столбец t_create:

mysql> UPDATE tsdemo2 SET val = val + 1;
mysql> SELECT * FROM tsdemo2;

+---------------------+---------------------+----+
|         t_update      |          t_create      | val |
+---------------------+---------------------+----+
| 20020715120012 | 20020715120003 |  6  |
+---------------------+---------------------+----+

Как и в случае с tsdemo1, обновления таблицы tsdemo2, которые в действительности не изменяют значения столбца, не вызывают изменения значений TIMESTAMP:

mysql> UPDATE tsdemo2 SET val = val + 0;
mysql> SELECT * FROM tsdemo2;

+----------------------+---------------------+----+
|           t_update     |         t_create       | val |
+---------------------+----------------------+----+
| 20020715120012 | 20020715120003 |  6   |
+---------------------+----------------------+----+

Можно было использовать для столбцов t_create и t_update и тип DATETIME. При создании записи их оба нужно было бы явно установить в NOW(). При изменении записи t_update устанавливался бы в NOW(), а t_create оставался неизменным.

Статьи по MySQL на эту тему:

Вывод значений TIMESTAMP в удобном для чтения виде
Вычисления со значениями TIMESTAMP Задача

Вернуться в раздел: MySQL / 5. Работа с датами и временем