Задавайте вопросы, мы ответим
Вы не зашли.
Версия 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'ом.
Пробовал снимать дамп и создавать новую базу на тойже машине, но это не помогло. Если этот дамп развернуть на другой машине, то там все нормально. Что-то с базой. Но хотелось бы найти решение проблемы без переустановки базы.
Неактивен
А что дает SELECT cast(incdate as date), cast(incdate as date)='2008-09-03' FROM mtable; ?
Неактивен
Есть жуткое ощущение, что CAST(incdate as DATE) с последующим неявным преобразованием
в строку дает 20080903, что, естественно, не совпадает с 2008-09-03
Неактивен
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
это как-то можно проверить?
Неактивен
это как-то можно проверить?
Неактивен
rgbeast написал:
это как-то можно проверить?
SELECT CONCAT('X', cast(incdate AS DATE), 'X') FROM mtable;
| CONCAT('X', cast(incdate AS DATE), 'X') |
| X2008-09-03X |
Неактивен
Очень странный у Вас глюк, надо сказать.
Неактивен
это точно. я вот думаю, может это какой-то глюк в файловых схемах, ведь если тотже дамп поставить на другую машину, то там все работает.
но, что самое интересное, вот такой запрос выдает результат:
>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'
нет
Неактивен
В общем, я нашел ошибку. Ситуация следующая.
В моей таблице для удобства (как я думал) разъяснения проблемы, я не выложил всю таблицу.
Для понимания бага будем считать, что таблица выглядит так:
>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 отрабатывал.
Неактивен
Если не возникает на другой mysql, то в bugs.mysql.com помещать его бесполезно. Вообще крайне странно.
Неактивен
да. мне тоже крайне странно. но факт в том что при использовании сортировки и ограничения количества записей (когда до NULL вообще не доходит) все работает. Видимо на NULL cast слетает с ошибкой. Вот елсиб можно было логи как-то посмотреть, если они есть вообще.
Неактивен
Работает ли обходной запрос?
select uid from mtable where cast(IFNULL(incdate, '1990-01-20') as date)='2008-09-03';
Неактивен
да работает
Неактивен
Может быть таблица повреждена. Попробуйте пересоздать
ALTER TABLE mtable ENGINE=MyISAM;
Неактивен