Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Выбор из БД диапозон дат


Автор: Самозванка 6.9.2007, 10:46
Есть 2 текстовых поля в котороые из календаря выбираются даты... то есть диапозон...с ... до ... . Формат дат yyyy-mm-dd. Также есть база данных, с столбцом дата и с таким же форматом. Задача: выбрать из БД все все строки, в которых Дата входит в этот диапазон.

Пыталась сделать так, понадеясь, что вдруг язык Php всё сам распознает:
Код

//Дата
if ($tip1=="date") 
{
for ($i=0, $size=odbc_num_rows($result1); $i<$size; $i++)
{
$f=odbc_fetch_array($result1);
$qt = $f['qtyonstock'];
$qty = substr($qt, 0, strpos($qt,".")+3);
$date = $f['datepart'];
$nd = substr($date, 0, strpos($date, " "));
if (($nd >= $date3) && ($nd<=$date4)) 
{
echo "<tr>";
$pr = $f['price'];
$pric = substr($pr, 0, strpos($pr,".")+3);
echo "<td>",$f['stockname'],"</td><td>",$f['goodname'],"</td><td>",$f['model'],"</td><td>",$nd,"</td><td>",$f['measureqty'],"</td><td>",$qty,"</td><td>",$pric,"</td>";
echo "</tr>";
} 
else 
{
continue;
}
}
echo "</table>";
}


Но увы...
Есть ли какие нить стандартные функции для работы с датами, подходящие для этой задачи?

Автор: BuShaRt 6.9.2007, 10:48
Самозванка, 
в MySQL тип поля с датой какой вообще?

Автор: Самозванка 6.9.2007, 10:52
BuShaRt, ИСпользуется Sybase  и к сожалению я не могу даже посмотреть его формат ( Но по умолчанию он выводит дату и время, потом я преобразую поле тока для даты)

Автор: BuShaRt 6.9.2007, 11:04
Самозванка, 
Желательно делать это на уровне базы. Переходите на MySQL.

Автор: Самозванка 6.9.2007, 11:06
BuShaRt, С радостью, но у нас бух прога на sybase работает. пока никак... а нельзя просто производить манипуляции с 3 полями формата yyyy-mm-dd. Выход же должен быть какой то...

Автор: BuShaRt 6.9.2007, 11:18
Самозванка, 
Регулярными выражениями.

Автор: Glip 6.9.2007, 12:41
http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/34010;lang=ru?DwebQuery=date+time#X

http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/6434;lang=ru?DwebQuery=between#X

sybase достаточно мощная СУБД, и все необходимое там можно найти smile

Автор: Самозванка 6.9.2007, 13:03
Спасибо конечно, но проблема то не в этом, проблема в вычислении диапозона дат и как работать с датами, когда я их уже получила в виде строки.

Автор: BuShaRt 6.9.2007, 13:18
Самозванка, 
Вы, если бы вас попросили собрать хвороста для костра, так же бы собрали сначала все, что плохо лежит, а потом бы, уже притащив на место, начали выбирать из этой кучи хворост?

Так и тут, лучше выбрать все что нужно, чем вытащить все и потом уже разбиратсья, "а что же нам было нужно?.

Если все же есть дикое желание делать все задом наперед, то ответ я уже дал "регулярные выражения".

Автор: Glip 6.9.2007, 13:31
Цитата(Самозванка @  6.9.2007,  10:46 Найти цитируемый пост)
Задача: выбрать из БД все все строки, в которых Дата входит в этот диапазон.

Код

select * from need_table where date_field between start_date and stop_date

или правильно формулируйте вопрос

Автор: console 6.9.2007, 13:35
Возможно ошибаюсь:
Код

mysql_query("SELECT * FROM sometable WHERE datefield>='pervaya_data' and datefield<='vtoraya_data'");

По сути и есть диапазон от первой даты (включая) до второй даты (включая).

Автор: Glip 6.9.2007, 13:55
Цитата(console @  6.9.2007,  13:35 Найти цитируемый пост)
Возможно ошибаюсь:

возможно, а именно в mysql_query smile

Добавлено через 2 минуты и 56 секунд
Самозванка,  читайте документацию на  http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTocView

Автор: Самозванка 6.9.2007, 15:32
Сделала так: 
Код

//Дата
if ($tip1=="date") 
{
$date31=$date3. "00:00:00.000000";
$date41=$date4. "00:00:00.000000";
$resultsel1=  odbc_exec( $conn, "select * from ipr_birja where datepart between '$date31' and  '$date41' ");
for ($i=0, $size=odbc_num_rows($resultsel1); $i<$size; $i++)
{
$f=odbc_fetch_array($result1);
$qt = $f['qtyonstock'];
$qty = substr($qt, 0, strpos($qt,".")+3);
$date = $f['datepart'];
$nd = substr($date, 0, strpos($date, " "));
echo "<tr>";
$pr = $f['price'];
$pric = substr($pr, 0, strpos($pr,".")+3);
echo "<td>",$f['stockname'],"</td><td>",$f['goodname'],"</td><td>",$f['model'],"</td><td>",$nd,"</td><td>",$f['measureqty'],"</td><td>",$qty,"</td><td>",$pric,"</td>";
echo "</tr>";
}
echo "</table>";
}


но не работает и ошибок не пишет

Автор: sTa1kEr 6.9.2007, 15:34
Самозванка, в PHP есть функция для парсинга строки в метку времени http://ru2.php.net/manual/ru/function.strtotime.php
Код

$date = strtotime($f['datepart']);
if ($date > mktime(0, 0, 0, 1, 1, 2007) && $date < mktime())
{
   // ...
}

Но я так же согласен, что и быстрее, и грамотнее делать это в запросе.

Автор: Самозванка 6.9.2007, 15:46
Правильно ли так писать запрос:
Код

$resultsel1=  odbc_exec( $conn, "select * from ipr_birja where datepart between '$date31' and  '$date41' ");

Автор: console 6.9.2007, 15:54
грамотнее ключевые слова запроса писать с БОЛЬШИХ БУКВ

Автор: Самозванка 6.9.2007, 15:54
console, хорошо. спасибо большое. запрос работает... проблема в чем то другом

Автор: Glip 6.9.2007, 16:43
а ничего что у вас название поля совпадает с названием функции в sybase "datepart" ?
и кажется мне, что добавлять время ."00:00:00.000000" не обязательно, запрос должен работать и без этого.

Автор: Самозванка 7.9.2007, 10:00
Glip, у меня нет такой функции.
И когда вывожу просто результат, не в таблице, всё работает:

Код

//Дата
if ($tip1=="date") 
{
$date31=$date3. "00:00:00.000000";
$date41=$date4. "00:00:00.000000";
$resultsel1=  odbc_exec( $conn, "select * from ipr_birja where datepart between '$date31' and  '$date41' ");
odbc_result_all( $resultsel1);
}


А так  нет:
Код

//Дата
if ($tip1=="date") 
{
$date31=$date3. "00:00:00.000000";
$date41=$date4. "00:00:00.000000";
$resultsel1=  odbc_exec( $conn, "select * from ipr_birja where datepart between '$date31' and  '$date41' ");
for ($i=0, $size=odbc_num_rows($resultsel1); $i<$size; $i++)
{
$f=odbc_fetch_array($resultsel1);
$qt = $f['qtyonstock'];
$qty = substr($qt, 0, strpos($qt,".")+3);
$date = $f['datepart'];
$nd = substr($date, 0, strpos($date, " "));
echo "<tr>";
$pr = $f['price'];
$pric = substr($pr, 0, strpos($pr,".")+3);
echo "<td>",$f['stockname'],"</td><td>",$f['goodname'],"</td><td>",$f['model'],"</td><td>",$nd,"</td><td>",$f['measureqty'],"</td><td>",$qty,"</td><td>",$pric,"</td>";
echo "</tr>";
}
echo "</table>";
}

Автор: Glip 7.9.2007, 10:09
ну тогда по шагам: смотрим что возвращает odbc_fetch_array($resultsel1)
и далее по коду

print_r и var_dump в руки smile

может быть имеет смысл заменить for на while 

Автор: Самозванка 7.9.2007, 10:15
Glip, да, написав этот вопрос, я так и стала делать, в итоге получилось... что $g=odbc_num_rows($resultsel1); возвращает отрицательное число. 

Вспомнила, что у SYBASE, когда запрос SELECT сложный эта функция не работает. как можно выйти из такой ситуации?

Автор: Glip 7.9.2007, 10:37
ну вот как раз while может пригодиться
Код

while ($f=odbc_fetch_array($resultsel1)) {
 ваше содержимое цикла
}


тем более что исмользование $i в теле цикла я не заметил.

Добавлено через 1 минуту и 3 секунды
а что мешает использовать непосредственно функции работы с sybase вместо odbc ?

Автор: Самозванка 7.9.2007, 10:43
Glip, спасибо. Супер! всё кк. А с функциями Sybase я в самом начале работы отказалась, сейчас уже не вспомню, но там с какими то проблемами столкнулась.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)