oracle sql developer中的右括号错误

iezvtpos  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(317)
SELECT titol, data_prestec 
FROM if_llibres, if_llibre_prestec
WHERE 
    if_llibre_prestec.ubicacio = if_llibres.ubicacio
    AND data_devolucio IS NULL
    AND data_prestec <= date_sub(current_date(),interval 30 day);
sbdsn5lh

sbdsn5lh1#

根本没有 DATE_SUB() 在甲骨文中的作用。你可以这样说:

select 
    titol, 
    data_prestec 
from if_llibres il
inner join if_llibre_prestec ilp 
    on ilp.ubicacio = il.ubicacio 
where 
    data_devolucio is null 
    and data_prestec <= current_date - interval '30' day;

请注意,我重写了您的查询以使用标准的显式连接(使用 on 关键字)而不是隐式联接(在 from 子句):这个几十年前的旧语法不应该用在新代码中。
我还建议在 SELECT 以及 WHERE 子句和它所属的(别名)表:这使查询明确且更易于理解。

3htmauhk

3htmauhk2#

减去30天闻起来像是“上个月”。如果这是你的意图,那么,不是所有的月份都有30天,所以你会得到错误的结果。请注意,oracle提供 ADD_MONTHS 函数,它允许你减去任何月数。对你来说-1个月。
此外, current_date 返回日期和时间,所以你减去1个月(或者30天,没关系),你会回到那一秒,而不是日期本身。
我的意思是:

SQL> alter session set nls_Date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select current_date as curdat,
  2         current_date - interval '30' day as cur_30,
  3         add_months(current_date, -1) as adm_1,
  4         --
  5         trunc(current_date) - interval '30' day as cur_trun_30,
  6         add_months(trunc(current_date), -1) as adm_trun_1
  7  from dual;

CURDAT              CUR_30              ADM_1               CUR_TRUN_30         ADM_TRUN_1
------------------- ------------------- ------------------- ------------------- -------------------
14.06.2020 21:49:43 15.05.2020 21:49:43 14.05.2020 21:49:43 15.05.2020 00:00:00 14.05.2020 00:00:00

SQL>
``` `CURDAT` 是当前日期(连同时间) `CUR_30` 减去30天;如你所见,你不是14点05分。但是15.05。在21:49:43,所以您的查询将返回日期值也取决于该时间的行 `ADM_1` 从当前日期减去1个月,它会把你带回到14.05.-再加上时间成分 `CUR_TRUN_30` 截断当前日期(并“删除”时间组件,将时间设置为当天开始时的午夜),但您又是15:05。-不是14.05。 `ADM_TRUN_1` 缩短当前日期并将您设置为14.05.2020 00:00,我相信这是您想要的
因此,我的建议是

SELECT titol,
data_prestec
FROM if_llibres join if_llibre_prestec ON if_llibre_prestec.ubicacio = if_llibres.ubicacio
WHERE data_devolucio IS NULL
AND data_prestec <= ADD_MONTHS(TRUNC(current_date), -1);

与您的问题无关,但我建议您始终使用表别名。以编写查询的方式,不可能知道哪个列属于哪个表,这会造成混乱。

相关问题