При работе с датами, тогда работайте с датами, а не со строками.'31-dec-2006'
это просто строка.Это выглядит как дата (для нас, людей), Oracle попытается преобразовать ее в дату (если это возможно), но вы никогда не можете быть уверены, что она будет работать.Например, он не будет работать в моей базе данных:
SQL> select count(*) From emp where hiredate < '31-dec-2006';
select count(*) From emp where hiredate < '31-dec-2006'
*
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected
Если я исправлю несколько вещей, он будет работать:
SQL> alter session set nls_date_language = english;
Session altered.
SQL> alter session set nls_date_format = 'dd-mon-yyyy';
Session altered.
SQL> select count(*) From emp where hiredate < '31-dec-2006';
COUNT(*)
----------
14
SQL>
Поэтому либо используйте литерал даты (который всегдавыглядит как date 'yyyy-mm-dd'
), или примените функцию TO_DATE
к строке с соответствующей маской формата, например to_date('31.12.2006', 'dd.mm.yyyy')
, и ваш запрос будет всегда работать.
Вотчто вы могли бы сделать (я сократил список столбцов);RENTPROPERTY
CTE перечисляет некоторые примеры данных;вам нужен код, начиная со строки 7.
SQL> with rentproperty (rp_street, rp_type, rp_datelisted) as
2 (select 'Oak street' , 'Type A', date '2000-01-25' from dual union all
3 select '31st street', 'Type B', date '2001-10-30' from dual union all
4 select 'Elm street' , 'Type B', date '2004-08-25' from dual union all
5 select 'Bee street' , 'Type A', date '2006-11-30' from dual
6 )
7 select rp_street,
8 rp_type,
9 (date '2006-12-31' - rp_datelisted) days_listed
10 from rentproperty
11 where rp_datelisted < date '2006-12-31'
12 order by rp_type asc, days_listed desc;
RP_STREET RP_TYP DAYS_LISTED
----------- ------ -----------
Oak street Type A 2532
Bee street Type A 31
31st street Type B 1888
Elm street Type B 858
SQL>