用问题中给出的日期进行数学运算

时间:2019-04-20 05:23:38

标签: sql oracle

以下是查询和查询附带的代码。我无法弄清楚如何在问题中使用日期2006年12月31日。

对于每个出租物业,列出地址,包括街道,城市,州。 还将出租类型和天数列出为“列出的天数”。按租赁类型递增的订购结果,列出的天数递减。 与其使用今天的日期来确定列出的日期,不如使用2006年12月31日

问题在于Im对此查询没有收到任何结果。我相信我在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 个答案:

答案 0 :(得分:2)

使用日期时,然后使用日期,而不是字符串。 '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 :(得分:1)

在oracle中,sysdate是当前日期,因此,除非今天是2006年12月31日,否则您将永远不会获得任何结果。如果您使用“ sysdate”作为列名,请尝试将其用引号引起来。

答案 2 :(得分:0)

sysdate ='2006年12月31日'条件为假,这就是为什么没有输出的原因!

这可能是您需要的:

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;

答案 3 :(得分:-1)

Oracle sysdate返回日期和时间。尝试使用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;