SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.09.2008 13:08:11

Олег
Участник
Зарегистрирован: 04.09.2008
Сообщений: 8

Непонятный глюк с cast(col as date)='_дата_'

Версия mysql: 5.0.45

есть таблица:
create table mtable (
uid bigint not null auto_increment,
created datetime,
incdate datetime,
primary key (uid)) CHARSET = utf8;

делаю селект:
>select * from mtable;
| uid | created | incdate |
| 1 | 2008-09-03 00:19:10 | 2008-09-03 00:19:10 |
видим, что есть запись.

далее:
>select uid, cast(created as date), cast(incdate as date), (cast(created as date)=cast(incdate as date)) from mtable where cast(created as date)='2008-09-03';
| uid | cast(created as date) | cast(incdate as date) | (cast(created as date)=cast(incdate as date)) |
| 1 | 2008-09-03 | 2008-09-03 | 1 |
выбралось нормально. проверили заодно равенство дат при cast

а вот теперь делаем такой селект, и получаем empty set:
>select uid from mtable where cast(incdate as date)='2008-09-03';
Empty set (0.00 sec)
хотя с такой датой запись присутствует.

но, что самое интересное, вот такой запрос отрабатывает:
>select uid from mtable where cast(incdate as date)='2008-09-03' order by uid desc limit 1;
| uid |
| 1 |
Причем именно DESC и имеено с LIMIT'ом.

Пробовал снимать дамп и создавать новую базу на тойже машине, но это не помогло. Если этот дамп развернуть на другой машине, то там все нормально. Что-то с базой. Но хотелось бы найти решение проблемы без переустановки базы.

Неактивен

 

#2 04.09.2008 13:11:38

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Непонятный глюк с cast(col as date)='_дата_'

А что дает SELECT cast(incdate as date), cast(incdate as date)='2008-09-03' FROM mtable; ?

Неактивен

 

#3 04.09.2008 13:22:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Непонятный глюк с cast(col as date)='_дата_'

Есть жуткое ощущение, что CAST(incdate as DATE) с последующим неявным преобразованием
в строку дает 20080903, что, естественно, не совпадает с 2008-09-03

Неактивен

 

#4 04.09.2008 16:42:41

Олег
Участник
Зарегистрирован: 04.09.2008
Сообщений: 8

Re: Непонятный глюк с cast(col as date)='_дата_'

rgbeast написал:

А что дает SELECT cast(incdate as date), cast(incdate as date)='2008-09-03' FROM mtable; ?

| cast(incdate AS DATE) | cast(incdate AS DATE)='2008-09-03' |
| 2008-09-03                 |                                                   1 |

paulus написал:

Есть жуткое ощущение, что CAST(incdate as DATE) с последующим неявным преобразованием в строку дает 20080903, что, естественно, не совпадает с 2008-09-03

это как-то можно проверить?

Неактивен

 

#5 04.09.2008 16:47:24

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Непонятный глюк с cast(col as date)='_дата_'

это как-то можно проверить?

SELECT CONCAT('X', cast(incdate AS DATE), 'X') FROM mtable;

Неактивен

 

#6 04.09.2008 17:51:24

Олег
Участник
Зарегистрирован: 04.09.2008
Сообщений: 8

Re: Непонятный глюк с cast(col as date)='_дата_'

rgbeast написал:

это как-то можно проверить?

SELECT CONCAT('X', cast(incdate AS DATE), 'X') FROM mtable;

| CONCAT('X', cast(incdate AS DATE), 'X') |
| X2008-09-03X                                       |

Неактивен

 

#7 04.09.2008 17:59:07

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Непонятный глюк с cast(col as date)='_дата_'

Очень странный у Вас глюк, надо сказать.

Неактивен

 

#8 04.09.2008 18:31:33

Олег
Участник
Зарегистрирован: 04.09.2008
Сообщений: 8

Re: Непонятный глюк с cast(col as date)='_дата_'

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

но, что самое интересное, вот такой запрос выдает результат:
>select uid from mtable where cast(incdate as date)='2008-09-03' order by uid desc limit 1;
| uid |
| 1 |
Причем именно DESC и имеено с LIMIT'ом.

, а такой
>select uid from mtable where cast(incdate as date)='2008-09-03'
нет

Неактивен

 

#9 04.09.2008 18:45:14

Олег
Участник
Зарегистрирован: 04.09.2008
Сообщений: 8

Re: Непонятный глюк с cast(col as date)='_дата_'

В общем, я  нашел ошибку. Ситуация следующая.
В моей таблице для удобства (как я думал) разъяснения проблемы, я не выложил всю таблицу.
Для понимания бага будем считать, что таблица выглядит так:

>select * from mtable;
| uid | created | incdate |
| 1 | 2008-09-03 00:19:10 | 2008-09-03 00:19:10 |
| 2 | 2008-09-04 00:19:10 | NULL                         |

теперь получаем глюк с empty set:

>select uid from mtable where cast(incdate as date)='2008-09-03';
Empty set (0.00 sec)

а теперь,

>update mtable set incdate=created where uid=2

и теперь все работает (когда исчезли записи NULL из колонки incdate):

>select uid from mtable where cast(incdate as date)='2008-09-03';
| uid |
| 1   |

вот такой баг. причем он не возникает у меня на другой mysql.
поэтому и запрос с orderby desc и limit отрабатывал.

Неактивен

 

#10 04.09.2008 19:27:50

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Непонятный глюк с cast(col as date)='_дата_'

Если не возникает на другой mysql, то в bugs.mysql.com помещать его бесполезно. Вообще крайне странно.

Неактивен

 

#11 04.09.2008 19:40:09

Олег
Участник
Зарегистрирован: 04.09.2008
Сообщений: 8

Re: Непонятный глюк с cast(col as date)='_дата_'

да. мне тоже крайне странно. но факт в том что при использовании сортировки и ограничения количества записей (когда до NULL вообще не доходит) все работает. Видимо на NULL cast слетает с ошибкой. Вот елсиб можно было логи как-то посмотреть, если они есть вообще.

Неактивен

 

#12 04.09.2008 19:44:38

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Непонятный глюк с cast(col as date)='_дата_'

Работает ли обходной запрос?
select uid from mtable where cast(IFNULL(incdate, '1990-01-20') as date)='2008-09-03';

Неактивен

 

#13 05.09.2008 16:29:33

Олег
Участник
Зарегистрирован: 04.09.2008
Сообщений: 8

Re: Непонятный глюк с cast(col as date)='_дата_'

да работает

Неактивен

 

#14 05.09.2008 16:32:17

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Непонятный глюк с cast(col as date)='_дата_'

Может быть таблица повреждена. Попробуйте пересоздать
ALTER TABLE mtable ENGINE=MyISAM;

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson