Я знаю, что есть несколько вопросов об этой ошибке, также для php.
Я перепробовал большинство ответов, но ничего не получается.
Это мой запрос:
"select
id,
employeenr,
name,
section,
description,
duration,
to_date(substr(startdate,0,12)||' '||starttime, 'DD-MM-YYYY HH24:MI:SS') starttime,
to_date(substr(enddate,0,12)||' '||endtime, 'DD-MM-YYYY HH24:MI:SS') endtime,
worktime,
statement,
remark
from
data
where 1=1
".$vw."AND startdate between to_date(':df 00:00:00', 'DD-MM-YYYY HH24:MI:SS') and to_date(':dt 23:59:59', 'DD-MM-YYYY HH24:MI:SS')
".$vw1."order by nvl(employeenr,0), startdate";
$parameters = array(':df' => $date_from, ':dt' => $date_to);
Эхо вар vw:
AND ( employeenr between '100000' and '199999'OR employeenr between '400000' and '499999'OR employeenr between '700000' and '799999'OR (employeenr is not null AND employeenr between '100000' and '199999'OR employeenr between '400000' and '499999'OR employeenr between '700000' and '799999'))
$ date_from и $ date_to:
$date_from = $_POST["date_from"]; // jQuery datepicker value
$date_to = $_POST["date_to"]; // jQuery datepicker value
Что я делаю неправильно?
Как $Parameters
позже? Похоже, что вы хотите использовать его как bind varibale массив для передачи позже в Oracle. Если это так, то вы используете это неправильно, потому что вместо того, чтобы хранить значение переменной, строка содержит SQL. Это не то, как переменные связывания работают в Oracle.
Вы должны дать Oracle полный запрос на анализ, только ценности в запросе может быть неизвестно (дата, число или строка). Это вы можете пройти позже. Вы не можете разобрать половину запроса и добавить больше SQL в переменную позже.
Так AND ?
не может быть проанализирован, так как здесь нет смысла. Что-то вроде AND X = ?
может быть проанализирован с другой стороны, так как Oracle ожидает получить значение для сравнения столбца X с более поздним, когда запрос будет выполнен.
Новый вопрос, новый ответ.
Тем не менее, вы не используете свою переменную связывания для переменной (дата, число или строка), но пытаетесь заменить часть строки с ним. Это не работает
':df 00:00:00'
является строкой, содержащей двоеточие, за которым следуют «d», «f» и т. д.
Используйте переменную связывания для полной строки, т.е.
AND startdate >= to_date(:date_from, 'DD-MM-YYYY')
AND startdate < to_date(:date_to, 'DD-MM-YYYY') + 1
или же
AND TRUNC(startdate) BETWEEN to_date(:date_from, 'DD-MM-YYYY')
AND to_date(:date_to, 'DD-MM-YYYY')
или же
AND startdate between to_date(:date_from || ' 00:00:00', 'DD-MM-YYYY HH24:MI:SS')
and to_date(:date_to || ' 23:59:59', 'DD-MM-YYYY HH24:MI:SS')
РЕШЕНИЕ
Я смог исправить мою проблему, удалив substr в области SELECT запроса.
$sql_report = "select
id,
employeenr,
name,
section,
description,
duration,
startdate,
starttime,
enddate,
endtime,
worktime,
statement,
remark
from
data
where 1=1
".$vw."AND startdate BETWEEN to_date('$date_from', 'DD-MM-YYYY') AND to_date('$date_to', 'DD-MM-YYYY')
".$vw1."order by nvl(employeenr,0), startdate";
$parameters = array();