获取最近5天的记录(不包括周末)?

时间:2018-11-23 18:23:37

标签: sql oracle oracle-sqldeveloper oracle12c plsqldeveloper

我正在尝试从过去5个工作日内在Oracle SQL上插入的表中提取记录 我无法将周日和周六排除在外(因为正在考虑在内)

Select * from xyz where xdate=:businessDate - 5 

此处businessDate(yyyymmdd格式)是作为参数的值

任何指针都将受到重视和赞赏。

5 个答案:

答案 0 :(得分:1)

SELECT * 
FROM xyz
WHERE 
  xdate >= TRUNC(SYSDATE) - 7 --last 7 days AND 
  TRUNC (xdate) - TRUNC (xdate, 'IW') NOT IN (5,6) --not sat or sun

获取最近7天的数据,并从周六或周日删除所有数据。

TRUNC (xdate) - TRUNC (xdate, 'IW')返回0到6之间的一个值。 0是星期一。这不受NLS日期设置的影响,因为它在两个truncs中都使用了相同的区域设置,因此,无论您所在国家的星期是从星期日还是星期一开始,计算结果都是相同的

在任何给定的7天时间里,您有5个工作日和2个周末

请注意,此查询假定该表没有将来的日期数据。如果确实存在限制,则xdate必须小于sysdate

答案 1 :(得分:0)

我不是Oracle专家,但这也可以工作

SELECT *
FROM xyz
WHERE xdate IN (:businessDate - 1, :businessDate - 2, :businessDate - 3, :businessDate - 4, :businessDate - 5, :businessDate - 6, :businessDate - 7)  AND MOD(TO_CHAR(xdate, 'J'), 7) + 1 NOT IN (6, 7);

答案 2 :(得分:0)

我会做的:

select * from xyz 
 where xdate >= TO_DATE( :businessDate, 'yyyymmdd' ) - 7
   and to_char( xdate, 'DAY' ) not in ( 'SAT', 'SUN' )

这是假设您正在使用英语数据库。这样可以给您带来过去7天的价值,但不包括周末。

答案 3 :(得分:0)

您需要执行以下操作:

WITH cteData AS (SELECT TO_DATE(:BUSINESSDATE, 'YYYYMMDD') AS BUSINESS_DATE FROM DUAL)
SELECT * 
  FROM XYZ x
  CROSS JOIN cteData d
  WHERE TRUNC(x.XDATE) BETWEEN d.BUSINESS_DATE - 7
                           AND d.BUSINESS_DATE AND
        TRUNC(x.XDATE) - TRUNC(x.XDATE, 'IW') <= 4

答案 4 :(得分:0)

在format_date函数中使用“ DAY”格式来查找周末,即星期日或星期六,例如

IF FORMAT_DATE(Date,'DAY')='SATURDAY' then date-1

IF FORMAT_DATE(Date,'DAY')='SUNDAY' then date-2

您将仅获得5天的记录