sql - Oracle 查询从给定数据集中获取周末
问题描述
我在 Oracle 中有表,其中EOW
的列表示周末。我想写一个查询来获取最近的周末结束日期。
表校准
DAY DAY OFTHE WEEK EOW
20181026 FRI Y
20181027 SAT N
20181028 SUN N
20181029 MON N
20181030 TUE N -->
20181031 WED N
20181101 THU N
20181102 FRI Y -->
20181103 SAT N
所以当我
select DAY , "logic" from cal where day = 20181030;
什么应该是“逻辑”,以便我获得最近的周末结束日期,在本例中为 20181026。
请帮忙!!
解决方案
我的猜测是,
If the date is 30-OCT-2018 (20181030), then you want last friday date as 26-OCT - 2018 (20181026).
另一个场景:
If the date is 27-OCT-2018 (20181027), in that case also you want last friday date which is 26-OCT - 2018 (20181026).
如果我的猜测是真的,那么下面的查询可能会起作用:
WITH TEMP1 AS
(
SELECT TO_CHAR(
TO_DATE('20181030','YYYYMMDD') ,'DD-MON-YY') AS DATE_TEST
FROM DUAL
)
SELECT next_day (TO_DATE(DATE_TEST,'DD-MON-YY')-7,'FRIDAY') Last_Friday
FROM TEMP1;
它将显示输出为:
LAST_FRIDAY
26-OCT-18
您可以稍后将其转换为所需的格式。
测试用例 2
WITH TEMP1 AS
(
SELECT TO_CHAR(
TO_DATE('20181103','YYYYMMDD') ,'DD-MON-YY') AS DATE_TEST
FROM DUAL
)
SELECT next_day (TO_DATE(DATE_TEST,'DD-MON-YY')-7,'FRIDAY') Last_Friday
FROM TEMP1;
输出 :
LAST_FRIDAY
02-NOV-18
现在打破上述查询:
CTE 中使用 WITH 子句。
WITH TEMP1 AS
(
SELECT TO_CHAR(
TO_DATE('20181103','YYYYMMDD') ,'DD-MON-YY') AS DATE_TEST
FROM DUAL
)
在这里, TO_DATE('20181103','YYYYMMDD') ,'DD-MON-YY' - 会将 20181103 转换为 03-NOV-2018。
因此 WITH 子句的结果(即 03-NOV-2018)将用于另一个查询:
SELECT next_day (TO_DATE(DATE_TEST,'DD-MON-YY')-7,'FRIDAY') Last_Friday
FROM TEMP1;
这里 DATE_TEST 是 with 子句的输出。第一的
TO_DATE(DATE_TEST,'DD-MON-YY')-7
从提到的日期开始需要前 7 天(当前是 DATE_TEST:03-NOV -2018),所以从 2018 年 11 月 3 日开始需要过去 7 天。
假设 :
DATE DAY Order
28-10-2018 SUN 1
29-10-2018 MON 2
30-10-2018 TUE 3
31-10-2018 WED 4
01-11-2018 THURS 5
02-11-2018 FRI 6
03-11-2018 SAT 7
我们得到了上面提到的所有 7 天。
next_day (TO_DATE(DATE_TEST,'DD-MON-YY')-7,'FRIDAY')
现在从 next_day 开始,我们可以得到另一天,在这里,我们通过在参数中提到它来请求 FRIDAY。所以星期五是 2018 年 2 月 11 日。
所以输出将是 02-11-2018。