andressc
19.07.2014 - 22:10
Здравствуйте!
Я хотел попросить помощи.
Проблема такая:
Есть таблица с полем data. По незнанию тип данных был сделан VARCHAR(255) (по идее надо было использовать DATE) дата записывается в формате 12.06.2012 т.е. dd.mm.yyyy. Необходимо с помощью sql запроса выбрать диапазон этих дат. Т.е. например выбрать все записи, где дата от 12.06.2012 до 23.07.2012.
пробовал BETWEEN но с таким форматом дат криво выводится.
Я понимаю, что можно переделать поля с VARCHAR на DATE, но тогда необходимо будет очень много менять в других скриптах, чтобы сохраняло корректно дату, а то если сохраняешь в поле DATE в таком виде (12.06.2012), то криво сохраняется, соответственно переделывать уйму скриптов, их действительно очень много.
Поэтому возникает вопрос, как решить эту задачу безболезненно, чтобы не менять формат данных и тип поля.
Заранее спасибо
andressc за такие перлы лучше заставить переписать, а не искать костыль.
По теме посмотри здесь
http://www.mysql.ru/docs/man/Cast_Functions.html
T1grOK
19.07.2014 - 22:25
Одного костыля CAST будет мало.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
andressc
29.07.2014 - 20:15
Вот, может кому пригодиться. Нашел решение проблемы. (естественно это только пример без проверки входящих переменных)
$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
29.07.2014 - 20:24
Цитата (andressc @ 19.07.2014 - 22:10) |
Я понимаю, что можно переделать поля с VARCHAR на DATE, но тогда необходимо будет очень много менять в других скриптах, чтобы сохраняло корректно дату, а то если сохраняешь в поле DATE в таком виде (12.06.2012), то криво сохраняется, соответственно переделывать уйму скриптов, их действительно очень много.
|
Можно сделать нужное поле с датой, не удаляя существующее. И сделать триггеры вставки и обновления, которые будут брать даты в текстовом виде и автоматически транслировать в нормальный вид и наоборот, из даты в текст (если они различаются). После чего можно не торопясь переделывать все запросы. Как только запросы будут переделаны, можно будет удалить триггеры, удалить уже не нужное поле с датой в текстовом виде.
И самое главное, что сразу же после создания триггеров можно будет проапдейтить таблицу и начать писать нормальные запросы с датами.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
linker
30.07.2014 - 09:06
Хочешь правильно? Переделай как положено через DATE.
_____________
Gear FrameworkGear Framework на Github
Valick
30.07.2014 - 10:59
Цитата |
Вот, может кому пригодиться. Нашел решение проблемы. |
вы нашли еще большую проблему
_____________
Стимулятор ~yoomoney - 41001303250491