SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 29.04.2011 13:59:38

Droy
Участник
Зарегистрирован: 29.04.2011
Сообщений: 4

BETWEEN без DATETIME

Здравствуйте.
Столкнулся с проблемой, которую никак не могу решить. Уже кипит голова.
Есть в таблице ячейка. Имя summary тип VARCHAR. В ней находятся данные в таким виде:
2011-04-20,2011-04-28,<тут произвольное кол-во символов>;2011-05-15,2011-06-09,<тут произвольное кол-во симолов>;
и т.д. и это все в одной записи. Таких записей много.

У меня есть запрос в виде даты, допустим: 2011-04-25,2011-05-20
Как можно догадаться во всех случаях идет "от и до" дата. Мне нужно записи в таблице, даты которых совпадают с датой запроса.
Как видно здесь обе записи совпадают, а вот если был запрос 2011-04-23,2011-04-30 - то попадала бы только первая. Хотя так как это все в одной ячейке, т.е. в одной записи, то вся бы запись взялась. Но это уже пол беды. Не буду же я брать каждую запись из базы и explode для того, чтобы разобрать.

Буду рад любым советам!

Отредактированно Droy (29.04.2011 14:01:42)

Неактивен

 

#2 29.04.2011 20:16:08

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: BETWEEN без DATETIME

Здравствуйте.

Думаю, что здесь - самое лучшее, это хранить даты, которые через запятую вбиты в записи summary в отдельной таблице( и чтобы тип там был не varchar, а date), то есть реализовать отношение многие ко многим. Далее спокойно сравнивать даты средствами sql.

Отредактированно deadka (29.04.2011 20:16:26)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 29.04.2011 20:44:49

Droy
Участник
Зарегистрирован: 29.04.2011
Сообщений: 4

Re: BETWEEN без DATETIME

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

Неактивен

 

#4 29.04.2011 20:54:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: BETWEEN без DATETIME

Ну, здесь это было бы лучше всего. Если не получается, то никуда не деться от того, чтобы разбивать каждую запись таблицы на кусочки и сравнивать с интервалом. Разве что даты у Вас в рамках одной записи отсортированы - тогда по идее можно поиграться как-то так:
функцией substr вырезать первую/последнюю запись, привести их к типу date и сравнивать с значениями, пришедшими извне.

Начните с

select cast(substr(summary,1,10) as date) from tablename;

Отредактированно deadka (29.04.2011 20:58:13)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 29.04.2011 22:10:49

Droy
Участник
Зарегистрирован: 29.04.2011
Сообщений: 4

Re: BETWEEN без DATETIME

Спасибо. Но к сожалению substr тоже не будет особо эффективен, т.к. в одной записи может быть несколько дат через точку с запятой. Существует в mysql что-то вроде аналога explode в php?

Отредактированно Droy (29.04.2011 22:11:55)

Неактивен

 

#6 29.04.2011 22:43:09

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: BETWEEN без DATETIME

Cамой функции explode не видно, она ж массив возвращает по идее...
Посмотрите сюда, может чем поможет.

Droy написал:

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

Я потому и уточнил, отсортированы ли даты в рамках одной записи. Если да, то достаточно посмотреть, попадает ли в интервал дат, пришедший извне, первая и последняя дата в записи. Если же не отсортированы, тады ой - либо хранимую процедуру писать, где разбить строки по символу ";" и их уже сравнивать, либо на клиенте, как Вы, похоже, и делаете.

Отредактированно deadka (29.04.2011 22:43:45)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 29.04.2011 22:51:33

Droy
Участник
Зарегистрирован: 29.04.2011
Сообщений: 4

Re: BETWEEN без DATETIME

Спасибо за помощь.
Сурово. Похоже придется уговаривать все переделать smile
Тему можно закрыть.

Неактивен

 

Board footer

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