Математика с датами, указанными в задаче - PullRequest
3 голосов
/ 20 апреля 2019

Ниже приведен запрос и код, прикрепленный к запросу. Я не могу понять, как использовать дату 31 декабря 2006 года в задаче.

Для каждого объекта аренды укажите адрес, указав улицу, город, штат. Также укажите тип аренды и количество дней, указанных в списке «Количество дней в списке». Результаты заказа по типу аренды по возрастанию и по количеству дней по убыванию Вместо использования текущей даты для определения перечисленных дней используйте 31 декабря 2006

Проблема в том, что я не получаю никаких результатов по этому запросу. Я считаю, что я делаю что-то не так в утверждении where. Я не уверен, как присвоить значение дате.

select rp_street, rp_city, rp_state, rp_type, (rp_datelisted - sysdate) as "Number of Days Listed"  
from rentproperty
where sysdate = '31-dec-2006'
order by rp_type asc, "Number of Days Listed" desc;

Ответы [ 4 ]

2 голосов
/ 20 апреля 2019

При работе с датами, тогда работайте с датами, а не со строками.'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>
1 голос
/ 20 апреля 2019

В oracle sysdate является текущей датой, поэтому, если сегодня не 31 декабря 2006 года, вы никогда не получите никаких результатов. Если вы использовали «sysdate» в качестве имени столбца, попробуйте поместить его в кавычки.

0 голосов
/ 20 апреля 2019

Системная дата Oracle возвращает дату и время.Попробуйте trunc (sysdate) для сравнения похожих значений.

select rp_street, rp_city, rp_state, rp_type, (rp_datelisted - sysdate) as "Number of Days Listed"  
from rentproperty
where trunc(sysdate) = '31-dec-2006'
order by rp_type asc, "Number of Days Listed" desc;
0 голосов
/ 20 апреля 2019

sysdate = '31 -dec-2006 'условие ложно, поэтому нет вывода !!

это, вероятно, то, что вам нужно:

select rp_street, rp_city, rp_state, rp_type, (rp_datelisted - sysdate) as "Number of 
Days Listed"  
from rentproperty
where  rp_datelisted= '31-dec-2006'
order by rp_type asc, "Number of Days Listed" desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...