首页 > 解决方案 > 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。

请帮忙!!

标签: sqloracle

解决方案


我的猜测是,

 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。


推荐阅读