在Oracle / PLSQL中显示从星期五的最后一周到星期五的最后一周的日期

时间:2018-03-19 23:53:33

标签: oracle

我想显示日期列中的日期,条件是 - 它应该只显示星期五上周五到上周五之前的日期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

如果您需要其他信息,请与我们联系。

提前致谢。

1 个答案:

答案 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,因此它可以使用索引;优化器不知道任何代数,甚至不知道五年级。