我正在尝试从过去5个工作日内在Oracle SQL上插入的表中提取记录 我无法将周日和周六排除在外(因为正在考虑在内)
Select * from xyz where xdate=:businessDate - 5
此处businessDate
(yyyymmdd格式)是作为参数的值
任何指针都将受到重视和赞赏。
答案 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天的记录