我想显示日期列中的日期,条件是 - 它应该只显示星期五上周五到上周五之前的日期oracle PL / SQL
我有以下代码,但它不起作用。请让我知道需要修复的内容。
SELECT Dates FROM tablename where dates BETWEEN TRUNC(Dates,'d')-2 AND TRUNC(Dates,'d')-9;
示例 -
日期栏的日期为2016年至2018年,示例 -
Table1 :
Dates
02/12/2016
04/07/2017
04/01/2018
09/03/2018
10/03/2017
12/03/2016
15/03/2018
当我运行查询时 - 它应显示在星期五前一周到星期五星期五之间的日期。那是 - 周五日期前一周是2018年3月9日,上周五是2018年3月16日。
现在,当我运行查询时,它应显示2018年3月9日(星期五)至2018年3月16日(星期五)之间的日期。
Required Output Table:-
Dates
09/03/2018
15/03/2018
如果您需要其他信息,请与我们联系。
提前致谢。
答案 0 :(得分:1)
这取决于你如何定义“周”,但也许下面的提示会有所帮助。
在世界的大部分地区,一周从星期一开始,到星期日结束。它是如此常见,它是“ISO周”(技术中的“标准周”)。特别是,给定一个日期 - 比如今天的日期,SYSDATE - 函数
trunc(...., 'iw')
将返回包含日期的ISO周的星期一。
NEXT_DAY(....,'Fri')返回第一个参数后的第一个星期五。如果你在星期五(或星期六)运行它,你就不会“一周之后”,你可以使用上面显示的TRUNC
函数。
这将为您提供当周的星期五。要减去一周或两周,您可以减去7或14。
您的WHERE条件可能类似于
where dates between next_day(trunc(sysdate, 'iw'), 'Friday') - 14
and next_day(trunc(sysdate, 'iw'), 'Friday') - 7
<强>注意强>:
您可能想将此简化为
where next_day(trunc(sysdate, 'iw'), 'Friday') - dates between 7 and 14
并且在数学上是正确的(平凡代数)。不要那样做!
如果你按照我第一次编写WHERE子句的方式编写它,如果你在dates
上有一个索引(正如你应该,如果你有很多查询在某些日期间隔中选择数据),优化器将能够使用索引。
如果你太聪明并且使用代数重写where
子句,正如我所示,你的代码会更短 - 但优化器将不再使用索引。优化器不够聪明,不能“看到”它可以在不等式的一侧隔离dates
,因此它可以使用索引;优化器不知道任何代数,甚至不知道五年级。