查找PL/SQL查询中的帮助。
商业案例:
从日期栏中提取前2天的数据,周末除外。
select * from holddbo.pos where eff_date = '15-NOV-2022'
的数据。
发布于 2022-11-14 10:02:54
也许这能回答你的问题:
WITH
tbl (A_DATE, A_VALUE) AS
(
Select TRUNC(SYSDATE) - 15 + LEVEL , 300 + LEVEL
From DUAL
Connect By LEVEL <= 14
),
grid AS
(
SELECT
A_DATE, A_VALUE,
To_Char(A_DATE, 'd') "DAY_NUM_OF_WEEK",
To_Char(A_DATE, 'DY') "DAY_OF_WEEK",
CASE
WHEN To_Char(A_DATE, 'DY') IN('MON', 'TUE') THEN A_DATE - 4
ELSE
A_DATE - 2
END "DAY_1",
CASE
WHEN To_Char(A_DATE, 'DY') = 'MON' THEN A_DATE - 3
ELSE
A_DATE - 1
END "DAY_2"
FROM
tbl
ORDER BY
A_DATE
)
Select
*
From
grid
Where
A_DATE = (Select DAY_1 From grid Where A_DATE = :Effective_Date)
OR
A_DATE = (Select DAY_2 From grid Where A_DATE = :Effective_Date)
/*
Result for :Effective_Date = '07-NOV-22' (MON)
A_DATE A_VALUE DAY_OF_WEEK
--------- ---------- -----------
03-NOV-22 304 THU
04-NOV-22 305 FRI
Result for :Effective_Date = '08-NOV-22' (TUE)
A_DATE A_VALUE DAY_OF_WEEK
--------- ---------- -----------
04-NOV-22 305 FRI
07-NOV-22 308 MON
Result for :Effective_Date = '09-NOV-22' (WED)
A_DATE A_VALUE DAY_OF_WEEK
--------- ---------- -----------
07-NOV-22 308 MON
08-NOV-22 309 TUE
*/
with子句(tbl)只生成一些要处理的示例数据。
在这里,创建一个名为DAY_1和DAY_2的网格,以根据问题中的规则附加DAY_2和日期。通过这种方式,可以在主SQL中对数据进行筛选。
注意:周日我没有处理:Effective_Day,以防你说周末被排除了--如果需要的话,你可以这样做。无论如何,星期六都会很好。
问候..。
加法
在评论之后..。
SELECT
A_DATE,
To_Char(A_DATE, 'd') "DAY_NUM_OF_WEEK",
To_Char(A_DATE, 'DY') "DAY_OF_WEEK",
CASE
WHEN To_Char(A_DATE, 'DY') IN('MON', 'TUE') THEN A_DATE - 4
ELSE
A_DATE - 2
END "DAY_1",
CASE
WHEN To_Char(A_DATE, 'DY') = 'MON' THEN A_DATE - 3
ELSE
A_DATE - 1
END "DAY_2"
FROM
dual
ORDER BY
A_DATE
如果您只想获得从给定日期开始的天数,请使用上面的查询将您的日期放在一起,而不是A_DATE。它将给出以下结果:
-- For A_DATE = '15-NOV-22'
-- A_DATE DAY_NUM_OF_WEEK DAY_OF_WEEK DAY_1 DAY_2
-- --------- --------------- ----------- --------- ---------
-- 15-NOV-22 2 TUE 11-NOV-22 14-NOV-22
--
-- For A_DATE = '10-NOV-22'
-- A_DATE DAY_NUM_OF_WEEK DAY_OF_WEEK DAY_1 DAY_2
-- --------- --------------- ----------- --------- ---------
-- 10-NOV-22 4 THU 08-NOV-22 09-NOV-22
用你的分贝
SELECT
CASE
WHEN To_Char(Your_Date_Column, 'DY') IN('MON', 'TUE') THEN Your_Date_Column - 4
ELSE
Your_Date_Column - 2
END "DAY_1",
CASE
WHEN To_Char(Your_Date_Column, 'DY') = 'MON' THEN Your_Date_Column - 3
ELSE
Your_Date_Column - 1
END "DAY_2"
FROM
Your_Table
ORDER BY
Your_Date_Column
..。或者你可以用双选择加入你的桌子来获得你的日子。
..。或在选择列表和/或where子句中从dual选择天数
..。任何适合你的方式
问候..。
如果您更新的问题意味着它的外观-以下是您更新的解决方案:
select
*
from
holddbo.pos
Where
eff_date = CASE WHEN To_Char(A_DATE, 'DY') IN('MON', 'TUE') THEN A_DATE - 4 ELSE A_DATE - 2 END --DAY_1
OR
eff_date = CASE WHEN To_Char(A_DATE, 'DY') = 'MON' THEN A_DATE - 3 ELSE A_DATE - 1 END; --DAY_2
只要把你的约会日期(‘15-11月-2022年“)代替A_DATE
发布于 2022-11-16 02:37:06
谢谢@d我做了几个加法,所以不用在多个地方更改日期
WITH cteData AS (SELECT TO_DATE('20220107', 'YYYYMMDD') AS BUSINESS_DATE FROM DUAL)
select * from holddbo.pos p
CROSS JOIN
cteData d
Where
p.effective_date = CASE WHEN To_Char(BUSINESS_DATE, 'DY') IN('MON', 'TUE') THEN BUSINESS_DATE - 4 ELSE BUSINESS_DATE - 2 END --DAY_1
OR
p.effective_date = CASE WHEN To_Char(BUSINESS_DATE, 'DY') = 'MON' THEN BUSINESS_DATE - 3 ELSE BUSINESS_DATE - 1 END --DAY_2
https://stackoverflow.com/questions/74426831
复制相似问题