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);
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 子句和它所属的(别名)表:这使查询明确且更易于理解。
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);
2条答案
按热度按时间sbdsn5lh1#
根本没有
DATE_SUB()
在甲骨文中的作用。你可以这样说:请注意,我重写了您的查询以使用标准的显式连接(使用
on
关键字)而不是隐式联接(在from
子句):这个几十年前的旧语法不应该用在新代码中。我还建议在
SELECT
以及WHERE
子句和它所属的(别名)表:这使查询明确且更易于理解。3htmauhk2#
减去30天闻起来像是“上个月”。如果这是你的意图,那么,不是所有的月份都有30天,所以你会得到错误的结果。请注意,oracle提供
ADD_MONTHS
函数,它允许你减去任何月数。对你来说-1个月。此外,
current_date
返回日期和时间,所以你减去1个月(或者30天,没关系),你会回到那一秒,而不是日期本身。我的意思是:
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);