Ошибка даты Oracle включена в течение действительного месяца

0

Мой запрос

SELECT POSSESSION.*,PLOT.*,SCHEME_BLOCK.BLOCK 
FROM POSSESSION, PLOT, SCHEME_BLOCK 
WHERE POSSESSION.PLOT_ID=PLOT.PLOT_ID AND PLOT.PLOT ='10' 
AND PLOT.BLOCK_ID = SCHEME_BLOCK.BLOCK_ID AND SCHEME_BLOCK.BLOCK_ID='3' 
AND POSSESSION.CREATED_ON between '1420066800' and '1443650400' 

MY php-код указан как..

$query = "SELECT " . $_REQUEST['tb'] . ".*,PLOT.*,SCHEME_BLOCK.BLOCK 
FROM " . $_REQUEST['tb'] . ", PLOT, SCHEME_BLOCK WHERE " . $_REQUEST['tb'] . ".PLOT_ID=PLOT.PLOT_ID AND PLOT.PLOT ='" . $_REQUEST['ps'] . "' 
AND PLOT.BLOCK_ID = SCHEME_BLOCK.BLOCK_ID AND SCHEME_BLOCK.BLOCK_ID='" . $_REQUEST['bid'] . "' AND SCHEME_BLOCK.CREATED_ON between '".strtotime(date('d-M-Y', strtotime($_REQUEST['sdate'])))."' and '".strtotime(date('d-M-Y', strtotime($_REQUEST['edate'])))."'";

Вставляя дату, которую я делаю

$CREATED_ON=date("d-M-Y");

Ошибка:

ORA-01843: not a valid month
01843. 00000 -  "not a valid month"
*Cause:    
*Action:

Пожалуйста, помогите мне... как я могу это исправить... Я кодирую в php

заранее спасибо

Теги:
date

3 ответа

0
Лучший ответ

Попробуйте переформулировать свой запрос:

$query = "SELECT " . $_REQUEST['tb'] . ".*,PLOT.*,SCHEME_BLOCK.BLOCK 
FROM " . $_REQUEST['tb'] . ", PLOT, SCHEME_BLOCK WHERE " . $_REQUEST['tb'] . ".PLOT_ID=PLOT.PLOT_ID AND PLOT.PLOT ='" . $_REQUEST['ps'] . "' 
AND PLOT.BLOCK_ID = SCHEME_BLOCK.BLOCK_ID AND SCHEME_BLOCK.BLOCK_ID='" . $_REQUEST['bid'] . "' AND TRUNC(SCHEME_BLOCK.CREATED_ON, 'DD/MM/YYYY') between " . "TO_DATE('" . date('d-m-Y', strtotime($_REQUEST['sdate'])) . "', 'DD/MM/YYYY') and TO_DATE('" . date('d-m-Y', strtotime($_REQUEST['edate'])) . "', 'DD/MM/YYYY')";
1

Во-первых, этот код выглядит как простая копия + вставка, которую вы действительно не понимаете:

strtotime(date('d-M-Y', strtotime($_REQUEST['sdate'])))

Фактически это делает:

  1. Возьмите строку
  2. Преобразовать в метку времени
  3. Преобразовать в строку
  4. Преобразовать в метку времени снова

Во всяком случае, Oracle не понимает отметки времени Unix в столбцах DATE. Вы должны использовать функцию TO_DATE(), чтобы создать правильную дату и, конечно же, подготовленные заявления, чтобы сделать все разумно. Что-то на этой линии:

$query = "SELECT ......... 
   AND POSSESSION.CREATED_ON between TO_DATE(:created_from, 'YYYY-MM-DD') 
       and TO_DATE(:created_to, 'YYYY-MM-DD')";

... и массив параметров будет выглядеть так:

$params = array(
    'created_from' => date('Y-m-d', $created_from_unix_timestamp),
    'created_to' => date('Y-m-d', $created_from_unix_timestamp),
);

... или это:

$params = array(
    'created_from' => $created_from_datetime_object->format('Y-m-d')
    'created_to' => $created_to_datetime_object->format('Y-m-d')
);

Тем не менее, вы должны знать, что даты без времени по умолчанию 00:00:00 поэтому строка там created_on является 2014-01-10 01:00:00 больше 2014-01-10.

И последнее, но не менее важное: ввод внешнего входного кода в ваш код:

"SELECT " . $_REQUEST['tb'] . "...

... это призыв к взлому. Шутки в сторону. Обычные оправдания ("Я исправлю это позже", "это только для внутреннего использования") - только это, оправдания.

1

POSSESSION.CREATED_ON между '1420066800' и '1443650400'

Если у вас есть значения в single-quotes, это string, поэтому '1443650400' НЕ DATE. Вы должны явно преобразовать его в DATE с использованием TO_DATE и правильной format model.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню