Как вставить datetime 0000-00-01 00:00:00 ?

algo

To the stars!
Как вставить datetime 0000-00-01 00:00:00 ?

MySQL 5, требуется вставить в базу промежуток в один день в поле datetime.
Менять тип поля нельзя...


mysql> create table d(a datetime);
Query OK, 0 rows affected (0.05 sec)

mysql> insert into d values ('0000-00-01 00:00:00');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------------+
| Warning | 1264 | Out of range value adjusted for column 'a' at row 1 |
+---------+------+-----------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from d;
+---------------------+
| a |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
1 row in set (0.00 sec)
 

Апельсин

Оранжевое создание
А какой у тебя sql mode и какая версия?

А меня в последней позволяет по дефолту вставлять, но я помню раньше генерило ошибку. Если мне не изменяет память ALLOW_INVALID_DATES помогало. Но я точно не помню.
 

algo

To the stars!
У меня 5ка последняя, я SQL_MODE смотрел - не помогает, и судя по мануалу, помогать не должно.

ALLOW_INVALID_DATES

Don't do full checking of dates. Check only that the month is in the range from 1 to 12 and the day is in the range from 1 to 31. This is very convenient for Web applications where you obtain year, month, and day in three different fields and you want to store exactly what the user inserted (without date validation). This mode applies to DATE and DATETIME columns. It does not apply TIMESTAMP columns, which always require a valid date.

This mode is implemented in MySQL 5.0.2. Before 5.0.2, this was the default MySQL date-handling mode. As of 5.0.2, the server requires that month and day values be legal, and not merely in the range 1 to 12 and 1 to 31, respectively. With strict mode disabled, invalid dates such as '2004-04-31' are converted to '0000-00-00' and a warning is generated. With strict mode enabled, invalid dates generate an error. To allow such dates, enable ALLOW_INVALID_DATES
mysql> set sql_mode='ALLOW_INVALID_DATES';
Query OK, 0 rows affected (0.04 sec)

mysql> insert into d values ('0000-00-01 00:00:00');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------------+
| Warning | 1264 | Out of range value adjusted for column 'a' at row 1 |
+---------+------+-----------------------------------------------------+
1 row in set (0.00 sec)
 

Апельсин

Оранжевое создание
Наверное совсем недавно что-то фиксили, потому что у меня все работает:

mysql> show create table test;
+-------+-------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`dt` datetime default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into test values('0000-00-00 00:00:00');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+---------------------+
| dt |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
1 row in set (0.00 sec)

mysql> select version();
+------------------+
| version() |
+------------------+
| 5.0.30-debug-log |
+------------------+
1 row in set (0.00 sec)
 

Апельсин

Оранжевое создание
algoб сорри, протупила.
Тогда никак без конвертации типов.

-~{}~ 25.11.06 14:35:

слушай, а тебе замена интервала в 1 день на интервал в 24 часа не подойдет? Потому что в поле типа time значение вида '24:00:00' нормально добавляется.
 

algo

To the stars!
А если в интервале 25 часов ? =)) В общем, спасибо, скрипты правлю на другой тип поля, жаль они 3rd party.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: algo
А если в интервале 25 часов ? =)) В общем, спасибо, скрипты правлю на другой тип поля, жаль они 3rd party.
Плохо, невесело живётся без встроенного типа interval, ага? ;)
 

algo

To the stars!
В mysql предполагается, очевидно, использование datetime в качестве interval.
Есть операции плюс итп. Но даты-то тоже, как оказалось, необходимо поддерживать корректно.. Просчет в архитектуре :/
 

Апельсин

Оранжевое создание
> В mysql предполагается, очевидно, использование datetime в качестве interval.
> Есть операции плюс итп.

тут ты не прав, обычные арифметические операции никогда не предлагалось применять к типам времени и даты. собственно для этого всякие adddate()/subdate() и были сделаны.
 

algo

To the stars!
Поигрался, там вообще что-то странное с типами... Например =)

mysql> select '1000-01-01 01:01:01'+'2000-02-02 02:02:02';
+---------------------------------------------+
| '1000-01-01 01:01:01'+'2000-02-02 02:02:02' |
+---------------------------------------------+
| 3000 |
+---------------------------------------------+
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: algo
В mysql предполагается, очевидно, использование datetime в качестве interval.
для дат нельзя без идиотизма определить арифметические действия (чему равно '25 ноября 2006' помножить на 10?), кроме вычитания, в результате которого получается как раз интервал, а для интервалов можно ('1 месяц' помножить на 10 будет '10 месяцев').

а уж почему тип интервал не реализовали (в стандарте он вроде бы есть) --- не знаю. наверное были заняты бенчмарками.
 

Апельсин

Оранжевое создание
algo, так как ты выполняешь арифметические действия, то он строки конвертирует в double и дальше операции выполняет с тем что вышло.
Запрос:
select '1000aaa'+'2000bbb';

выдаст тебе такой же результат.
 
Сверху