[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка из базы диапазона дат
andressc
Здравствуйте!

Я хотел попросить помощи.

Проблема такая:
Есть таблица с полем data. По незнанию тип данных был сделан VARCHAR(255) (по идее надо было использовать DATE) дата записывается в формате 12.06.2012 т.е. dd.mm.yyyy. Необходимо с помощью sql запроса выбрать диапазон этих дат. Т.е. например выбрать все записи, где дата от 12.06.2012 до 23.07.2012.

пробовал BETWEEN но с таким форматом дат криво выводится.

Я понимаю, что можно переделать поля с VARCHAR на DATE, но тогда необходимо будет очень много менять в других скриптах, чтобы сохраняло корректно дату, а то если сохраняешь в поле DATE в таком виде (12.06.2012), то криво сохраняется, соответственно переделывать уйму скриптов, их действительно очень много.

Поэтому возникает вопрос, как решить эту задачу безболезненно, чтобы не менять формат данных и тип поля.

Заранее спасибо
TMake
andressc за такие перлы лучше заставить переписать, а не искать костыль.

По теме посмотри здесь http://www.mysql.ru/docs/man/Cast_Functions.html
T1grOK
Одного костыля CAST будет мало.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
andressc
Вот, может кому пригодиться. Нашел решение проблемы. (естественно это только пример без проверки входящих переменных)

$data = $_POST['datas']; //дата начальная 23.05.2014
$data2 = $_POST['datas2']; //дата конечная 28.05.2014

if($data2 != '')
{
$data_explode = explode('.', $data); //разбиваем на день месяц и год
$data_explode2 = explode('.', $data2); //разбиваем на день месяц и год

//для удобства загоняем в переменные
$data1_day = $data_explode[0];
$data1_mounth = $data_explode[1];
$data1_year = $data_explode[2];

$data2_day = $data_explode2[0];
$data2_mounth = $data_explode2[1];
$data2_year = $data_explode2[2];

//используем mktime()
$a=mktime(0,0,0, $data1_mounth, $data1_day, $data1_year);
$b=mktime(1,0,0, $data2_mounth, $data2_day, $data2_year);
$datochka = '';

//потом в цикле делаем одну длинную строчку типа '23.05.2014','24.05.2014','25.05.2014','26.05.2014','27.05.2014','28.05.2014',
while ($a <= $b)
{
$datochka.= "'".date('d.m.Y',$a)."',";
$a+=86400;// прибавляем 86400 секунд (24 часа)
}
$datochka = substr($datochka,0,-1);//убираем последнюю запятую
}
else
{
$datochka = "'".$data."'";
}



и в запросе используем IN

'select `text` FROM `statistics` WHERE `data` IN($datochka);'

разумеется это только временное решение, просто надо было срочно сделать, впоследствии переделано будет.
sergeiss
Цитата (andressc @ 19.07.2014 - 22:10)
Я понимаю, что можно переделать поля с VARCHAR на DATE, но тогда необходимо будет очень много менять в других скриптах, чтобы сохраняло корректно дату, а то если сохраняешь в поле DATE в таком виде (12.06.2012), то криво сохраняется, соответственно переделывать уйму скриптов, их действительно очень много.

Можно сделать нужное поле с датой, не удаляя существующее. И сделать триггеры вставки и обновления, которые будут брать даты в текстовом виде и автоматически транслировать в нормальный вид и наоборот, из даты в текст (если они различаются). После чего можно не торопясь переделывать все запросы. Как только запросы будут переделаны, можно будет удалить триггеры, удалить уже не нужное поле с датой в текстовом виде.
И самое главное, что сразу же после создания триггеров можно будет проапдейтить таблицу и начать писать нормальные запросы с датами.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
linker
Хочешь правильно? Переделай как положено через DATE.

_____________
Gear Framework
Gear Framework на Github
Valick
Цитата
Вот, может кому пригодиться. Нашел решение проблемы.

вы нашли еще большую проблему


_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.