2015-04-16 3 views
0

Мне нужно перенести день, предшествующий дате в Oracle, с использованием усечения, но не как. Он использовал следующую строку, но привел мне несколько записей для текущего дня исполнения, и этого не должно быть. Несейсто только вчера; исследование обнаружило усечение с датами в Oracle, но не с его использованием.Получить дату предыдущего дня в Oracle

and fnxs.FECHA_INGRESO BETWEEN (TO_CHAR (SYSDATE-1, 'DD-MON-YY')) AND (TO_CHAR (SYSDATE, 'DD-MON-YY')); 

Я ценю вашу помощь

+0

Действительно ли вы хотите, чтобы вчерашние записи? Вы приняли ответ, который может вернуть сегодняшние записи. – Gerrat

+1

Не храните даты в столбцах 'varchar'. Вы должны это исправить как можно скорее. –

ответ

0

Использование BETWEEN с датами в Oracle как правило, плохая идея. Я вижу это все время, и большую часть времени люди ошибаются (как в принятом ответе выше). Даже когда они полностью понимают, что эти две даты включены, они все же делают логические ошибки, потому что они забывают о временных отметках.

ОП просит вчерашние даты. Следующий SQL показывает, что сегодня подпадает под "МЕЖДУ TRUNC (SYSDATE) - 1 и TRUNC (SYSDATE)"

with adate as (
    select trunc(sysdate) today from dual 
) select today from adate where today between trunc(sysdate) -1 
and trunc(sysdate); 

16-Apr-15 00:00:00 [возвращает запись на сегодняшний день]

Я считаю, что проще быть правильным с датами, когда вы более четко о конечных точках:

SELECT * from your_table 
WHERE fnxs.FECHA_INGRESO >= TRUMC(SYSDATE) - 1 
AND fnxs.FECHA_INGRESO < TRUNC(SYSDATE); 

при приглядевшись, оп дата, как колонна может быть VARCHAR2 (по-прежнему может быть дата который был неявно включен в t он сравнил его). Если это VARCHAR, то его необходимо сначала преобразовать (используя соответствующую строку формата):

SELECT * FROM your_table 
WHERE TO_DATE(fnxs.FECHA_INGRESO, 'DD-MON-YY') >= TRUMC(SYSDATE) - 1 
AND TO_DATE(fnxs.FECHA_INGRESO, 'DD-MON-YY') < TRUNC(SYSDATE); 
+0

«* Использование BETWEEN с датами, как правило, плохая идея *» - с * реальными * датами это не так. К сожалению, «дата» Oracle - это «timestamp» (или «datetime»), у нее нет «реальной» даты (т. Е. Даты и только даты, а не части времени). –

+0

Хорошо, я лучше подпишу свое заявление. – Gerrat

+0

@a_horse_with_no_name: Даже без временных меток другой ответ неверен. Полагаю, я должен сказать, что многие люди не понимают, что «МЕЖДУ» включает конечные точки. – Gerrat

1

Если предположить, что столбец имеет тип DATE

SELECT * 
FROM TABLE_NAME 
WHERE FECHA_INGRESO BETWEEN TRUNC(SYSDATE) - 1 
         AND TRUNC(SYSDATE); 

Если это строка символов, то:

SELECT * 
FROM TABLE_NAME 
WHERE TO_DATE(FECHA_INGRESO, 'DD-MON-YY') 
      BETWEEN TRUNC(SYSDATE) - 1 
       AND TRUNC(SYSDATE); 
+0

Спасибо! это правильное решение. –

+0

. Ваше решение включает записи на сегодня – Gerrat

Смежные вопросы