Если вы хотите сравнить даты, вам не следует преобразовывать их в строки — Oracle имеет встроенную поддержку арифметики даты/времени.
В вашем случае кажется, что вы запрашиваете таблицу, в которой месяц даты отъезда равен предыдущему месяцу, что не имеет смысла. Если сейчас ноябрь, то запрос вернет строки за октябрь 2010 г., октябрь 2009 г., октябрь 2008 г. и т. д. Вы уверены, что это то, что вам нужно?
Один из лучших способов использовать арифметику дат для определения того, относится ли дата к предыдущему месяцу, — это использовать комбинацию TRUNC(дата,'МЕСЯЦ'), которая возвращает первый день текущего месяца, с ADD_MONTHS(дата,- 1), который получает дату на месяц раньше.
SELECT TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
TO_CHAR(ADD_MONTHS(sysdate, -1), 'mm') as "Current_Month"
FROM "HOL_DEPART_DATES"
WHERE "HOL_DEPART_DATES"."DEPART_DATE"
BETWEEN ADD_MONTHS(TRUNC(SYSDATE,'MONTH'),-1)
AND TRUNC(SYSDATE,'MONTH') - 0.00001;
«0,00001» вычитает одну секунду из даты, поэтому диапазон дат фактически становится (при условии, что сейчас ноябрь 2010 г.) от 01 октября 2010 г. 00:00:00 до 31 октября 2010 г. 23:59:59.
Альтернативный эквивалентный синтаксис:
SELECT TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
TO_CHAR(ADD_MONTHS(sysdate, -1), 'mm') as "Current_Month"
FROM "HOL_DEPART_DATES"
WHERE "HOL_DEPART_DATES"."DEPART_DATE"
>= ADD_MONTHS(TRUNC(SYSDATE,'MONTH'),-1)
AND "HOL_DEPART_DATES"."DEPART_DATE" < TRUNC(SYSDATE,'MONTH');
person
Jeffrey Kemp
schedule
27.11.2010