Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / три вопроса про хранение Даты / 14 сообщений из 14, страница 1 из 1
16.11.2013, 18:26:49
    #38467380
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
1) таймзоны в DateTime полях
Вопрос навеян исключительно статями данного форума (например: http://www.sql.ru/forum/311647/datetime-or-int?hl=datetime timestamp)
Всю жизнь хранил даты в datetime полях, и тут вдруг бах, вижу что народ говорит что в них есть косяки, что при переходе с зимнего на летнее время есть проблемы.
Вроде десятки раз менялись зоны, но никогда не видел чтобы в время менялось после перехода с зимнего на летнее.
Актуальная ли это проблема?

2) диапазон timestamp
В документации написано что в timestamp ограниченный диапазон значений - с 1970 по 2038 год
Почему он такой короткий? Ведь поле timestamp - 4 байта!
4 байта = 4 294 967 296 значений
делим на 60 секунд, 60 минут, 24 часа, 366 дней, и получаем что в четырёх байтах мы можем хранить более 135 лет!
Почему тогда в timestamp можно хранить только 68 лет?

3) хранение одновременно и даты создания записи и даты изменения
timestamp даёт возможность отслеживать время создание записи или время изменения.
Почем нельзя иместь сразу два автовычисляемых поля timestamp (чтобы значть и когда поле создалось и когда модифицировалось в последний раз)?
...
Рейтинг: 0 / 0
17.11.2013, 12:47:31
    #38467691
artas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
InterSky,

2, там может быть отрицательное значение, если надо дата раньше 1970
...
Рейтинг: 0 / 0
17.11.2013, 21:48:57
    #38467956
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
1) Мало ли кто что говорит... у тебя нет этой проблемы? точную методику её воспроизведения сыскал? а кооли нет - чё дёргаться раньше времени...
3) Не так. Или первого изменения (т.е. создания), или последнего. Два поля - скажем во второе копируешь из первого в триггере after insert.
...
Рейтинг: 0 / 0
18.11.2013, 03:45:23
    #38468078
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
artas2, там может быть отрицательное значение, если надо дата раньше 1970
Попробуй выполнить:
UPDATE Table SET PoleTimeStamp='1970-01-01' WHERE id=1
и получишь ошибку!
Incorrect datatime value '1970-01-01' for column 'PoleTimeStamp' at row 1
в это поле можно вносить только значения начиная с 1970-01-01 00:00:01', если мне надо раньше 1970 - то я это поле не могу использовать!


Akina1) Мало ли кто что говорит... у тебя нет этой проблемы? точную методику её воспроизведения сыскал? а кооли нет - чё дёргаться раньше времени...
Ища информацию на этом форуме я дважды наткнулся на упоминание сдешних посетителей об этой проблеме, и ни одного опровержения. По этому и поинтересовался, так как до этого не слышал о такой проблеме (и ссылку на один из топиков на этом форуме указал).

Akina3) Не так. Или первого изменения (т.е. создания), или последнего. Два поля - скажем во второе копируешь из первого в триггере after insert.
Ну если создавать тригеры, то можно и вовсе обойтись без функционала полей timestamp, просто текущее время вносишь в нужное поле и всё...
Мой же вопрос: Почему нельзя иместь сразу два автовычисляемых поля timestamp (поставив одному отмечать дату создания, а второму дату изменения записи)?
В чём причина такого ограничения?
...
Рейтинг: 0 / 0
18.11.2013, 09:13:37
    #38468144
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
InterSkyИща информацию на этом форуме я дважды наткнулся на упоминание сдешних посетителей об этой проблеме, и ни одного опровержения. По этому и поинтересовался, так как до этого не слышал о такой проблеме (и ссылку на один из топиков на этом форуме указал).
По ссылке НИЧЕГО нет. Кроме абстрактного указания на то, что значение поля типа TIMESTAMP заносится и отдаётся с учётом локальной временнОй зоны. По-моему, вполне нормальное положение вещей. А если кто-то не помнит таких вещей или неспособен учитывать их, и это У НЕГО вызывает проблемы - то это проблемы не типа данных, а программиста.

Ну и вообще:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.10-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create table test(
    -> ts1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    -> ,
    -> ts2 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
    -> ,
    -> val int
    -> );
Query OK, 0 rows affected (1.13 sec)

mysql> insert into test(val) select 1 union select 2;
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into test(val) select 3 union select 4;
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> update test set val=val+2 where mod(val, 2) = 1;
Query OK, 2 rows affected (0.06 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from test;
+---------------------+---------------------+------+
| ts1                 | ts2                 | val  |
+---------------------+---------------------+------+
| 2013-11-18 09:08:38 | 2013-11-18 09:09:42 |    3 |
| 2013-11-18 09:08:38 | 0000-00-00 00:00:00 |    2 |
| 2013-11-18 09:08:49 | 2013-11-18 09:09:42 |    5 |
| 2013-11-18 09:08:49 | 0000-00-00 00:00:00 |    4 |
+---------------------+---------------------+------+
4 rows in set (0.01 sec)

mysql> update test set val=3 where mod(val, 2) = 1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 2  Changed: 1  Warnings: 0

mysql> select * from test;
+---------------------+---------------------+------+
| ts1                 | ts2                 | val  |
+---------------------+---------------------+------+
| 2013-11-18 09:08:38 | 2013-11-18 09:09:42 |    3 |
| 2013-11-18 09:08:38 | 0000-00-00 00:00:00 |    2 |
| 2013-11-18 09:08:49 | 2013-11-18 09:12:33 |    3 |
| 2013-11-18 09:08:49 | 0000-00-00 00:00:00 |    4 |
+---------------------+---------------------+------+
4 rows in set (0.00 sec)


Поле ts1 хранит штамп времени создания записи, поле ts2 либо ноль, либо штамп времени фактического изменения.
...
Рейтинг: 0 / 0
18.11.2013, 13:33:53
    #38468510
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
AkinaПоле ts1 хранит штамп времени создания записи, поле ts2 либо ноль, либо штамп времени фактического изменения.
Вообще-то проблема возникает раньше. Уже на стадии:
Код: sql
1.
2.
3.
4.
create table test(
ts1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
ts2 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
val int);


Получаем:
MySQL 5.5.8SQL execution error # 1293. Response from the database:
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
...
Рейтинг: 0 / 0
18.11.2013, 14:08:46
    #38468569
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
InterSkyВообще-то проблема возникает раньше. Уже на стадии:
А на 5.6.10 работает. Я для кого консоль цитирую, а?
Обнови версию, и забудь о проблеме.
...
Рейтинг: 0 / 0
18.11.2013, 17:16:09
    #38468903
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
AkinaА на 5.6.10 работает. Я для кого консоль цитирую, а?
Обнови версию, и забудь о проблеме.
Круто! Хоть что-то пофиксили, а то лет 10 проблема была :)
А есть где-то на русском подробное описание что нового в 5.6 по сравнению с 5.5 ?
...
Рейтинг: 0 / 0
19.11.2013, 10:28:19
    #38469473
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
только если используются переменные для нумерации - на 5.6.+ работать перестанет))
...
Рейтинг: 0 / 0
20.11.2013, 03:31:36
    #38470699
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
InterSkyAkinaА на 5.6.10 работает. Я для кого консоль цитирую, а?
Обнови версию, и забудь о проблеме.
Круто! Хоть что-то пофиксили, а то лет 10 проблема была :)
А есть где-то на русском подробное описание что нового в 5.6 по сравнению с 5.5 ?

:) ну на фоне проблемы была и слабодокументированная возможность

поле 1 - меткавремени без умалчиваемого значения разрешено НУЛЛ
поле 2 - меткавремени по умолчанию текущее при обновлении текущее

но вот хитрость.

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

у меня на том и держаться поля ctime mtime :)
...
Рейтинг: 0 / 0
20.11.2013, 23:01:59
    #38472075
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
Cygapb-007только если используются переменные для нумерации - на 5.6.+ работать перестанет))
К сожалению совершенно не понял смысла ваших слов :(
...
Рейтинг: 0 / 0
20.11.2013, 23:24:36
    #38472098
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
alex564657498765453,

Идея интересная, но не является ли она чисто теоретической?
Потому что когда я создаю таблицу запросом:
Код: sql
1.
2.
3.
4.
CREATE TABLE `tt1` (
  `id` int(11),
  `tt` timestamp NOT NULL
) ENGINE=MyISAM;


и потом смотрю DLL - то вижу что MySQL преобразовал её в:
Код: sql
1.
2.
3.
4.
CREATE TABLE `tt1` (
  `id` int(11) DEFAULT NULL,
  `tt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


и если я пытаюсь создать ещё одно поле с timestamp с условиями - то получаю сообщение о том что два таких поля нельзя:
MySQL 5.5.8SQL execution error # 1293. Response from the database:
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
...
Рейтинг: 0 / 0
24.11.2013, 00:54:23
    #38475510
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
InterSky,

я же написал, у меня так работает.

счас посмотрю каким кодом создавалась база, ибо давно работаю мышкой в кейс средствах проектирования БД
...
Рейтинг: 0 / 0
24.11.2013, 00:57:29
    #38475514
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
три вопроса про хранение Даты
InterSkyalex564657498765453,

Идея интересная, но не является ли она чисто теоретической?
Потому что когда я создаю таблицу запросом:
Код: sql
1.
2.
3.
4.
CREATE TABLE `tt1` (
  `id` int(11),
  `tt` timestamp NOT NULL
) ENGINE=MyISAM;


и потом смотрю DLL - то вижу что MySQL преобразовал её в:
Код: sql
1.
2.
3.
4.
CREATE TABLE `tt1` (
  `id` int(11) DEFAULT NULL,
  `tt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


и если я пытаюсь создать ещё одно поле с timestamp с условиями - то получаю сообщение о том что два таких поля нельзя:
MySQL 5.5.8SQL execution error # 1293. Response from the database:
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

ёшкин кот, я же написал
пооле для даты создания - без значени по умолчанию РАЗРЕШЕНО НУЛЛ!!!
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / три вопроса про хранение Даты / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]