根据Oracle中的开始日期获取下一个日期

时间:2014-03-20 07:54:54

标签: plsql oracle11g

我有一个场景,我必须根据系统中的交付日期获取接收日期。

我所指的样本系统是购物车,对于每个订单,接收日期可以是5个日期中的任何一个。

例如,

SHOP_ID         CITY        ST  MON TUE WED THU FRI
0566567890823   CARLSBAD    CA  M           H   
1950567890821   SAN DIEGO   CA  M           H   
2171567890842   ESCONDIDO   CA      T       H   
1028567890864   CALEXICO    CA      T       H   
1950567890849   SAN DIEGO   CA                  F
2171567890878   ESCONDIDO   CA          W       F
1274567890882   CHULA VISTA CA      T       H   
2414567890891   EL CAJON    CA  M               
0634567890804   ESCONDIDO   CA  M           H   
1274567890845   CHULA VISTA CA          W       F
0634567890828   ESCONDIDO   CA                  F
2414567890897   EL CAJON    CA          W       F

因此,对于商店' 0566567890823',如果交货日期是明天(3月21日),则提货日期是最接近的星期一(3月24日),因为商店在星期一和星期四接受订单。 / p> 同样,如果交货日期是星期二(3月25日),商店会在星期四(3月27日)接受订单。

有人可以帮我查询一下,根据店铺ID和交货日期给我一个可能的取件日期

以下是表格的创建和插入脚本。

CREATE TABLE  "DELIVERY_DETAILS" (
"SHOP_ID" VARCHAR2(15) NOT NULL ENABLE,
"CITY" VARCHAR2(15),
"STATE" VARCHAR2(15),
"MON" CHAR(1), 
"TUE" CHAR(1), 
"WED" CHAR(1), 
"THU" CHAR(1), 
"FRI" CHAR(1)
);

INSERT INTO DELIVERY_DETAILS VALUES
('0566567890823', 'CARLSBAD', 'CA', 'M', '', '', 'H', '');
INSERT INTO DELIVERY_DETAILS VALUES
('1950567890821', 'SAN DIEGO', 'CA', 'M', '', '', 'H', '');
INSERT INTO DELIVERY_DETAILS VALUES
('2171567890842', 'ESCONO', 'CA', '', 'T', '','H', '');
INSERT INTO DELIVERY_DETAILS VALUES
('1028567890864', 'CALEXICO', 'CA', '', 'T', '', 'H', '');
INSERT INTO DELIVERY_DETAILS VALUES
('1950567890849', 'SAN DIEGO', 'CA', '', '', '', '', 'F');
INSERT INTO DELIVERY_DETAILS VALUES
('2171567890878', 'ESCONDIDO', 'CA', '', '', 'W', '', 'F');
INSERT INTO DELIVERY_DETAILS VALUES
('1274567890882', 'CHULA VISTA', 'CA', '','T', '','H', '');
INSERT INTO DELIVERY_DETAILS VALUES
('2414567890891', 'EL CAJON', 'CA', 'M', '', '', '', '');
INSERT INTO DELIVERY_DETAILS VALUES
('0634567890804', 'ESCONDIDO', 'CA', 'M', '', '', 'H', '');
INSERT INTO DELIVERY_DETAILS VALUES
('1274567890845', 'CHULA VISTA', 'CA', '', '', 'W', '', 'F');
INSERT INTO DELIVERY_DETAILS VALUES
('0634567890828', 'ESCONDIDO', 'CA', '', '', '', '', 'F');
INSERT INTO DELIVERY_DETAILS VALUES
('2414567890897', 'EL CAJON', 'CA', '', '', 'W', '', 'F');

输入是系统驱动的交货日期(也可以是系统日期),输出是商店可能的提货日期。

与上面的例子类似,如果它是' M',提货将在下周一最近

非常感谢

2 个答案:

答案 0 :(得分:0)

这不是一个合适的解决方案。但你可以考虑这些功能并检查。

SELECT T1.*,
       DELIVERY,
       LEAST ( NVL ( ABS ( M - DELIVERY ), 8 ),
               NVL ( ABS ( T - DELIVERY ), 8 ),
               NVL ( ABS ( W - DELIVERY ), 8 ),
               NVL ( ABS ( H - DELIVERY ), 8 ),
               NVL ( ABS ( F - DELIVERY ), 8 ) )
          LEASTVAL,
FROM   (SELECT SHOP_ID,
               CASE
                  WHEN MON IS NOT NULL
                  THEN
                     NEXT_DAY ( TRUNC ( SYSDATE ), 'MONDAY' )
                  ELSE
                     NULL
               END
                  AS M,
               CASE
                  WHEN TUE IS NOT NULL
                  THEN
                     NEXT_DAY ( TRUNC ( SYSDATE ), 'TUESDAY' )
                  ELSE
                     NULL
               END
                  AS T,
               CASE
                  WHEN WED IS NOT NULL
                  THEN
                     NEXT_DAY ( TRUNC ( SYSDATE ), 'WEDNESDAY' )
                  ELSE
                     NULL
               END
                  AS W,
               CASE
                  WHEN THU IS NOT NULL
                  THEN
                     NEXT_DAY ( TRUNC ( SYSDATE ), 'THURSDAY' )
                  ELSE
                     NULL
               END
                  AS H,
               CASE
                  WHEN FRI IS NOT NULL
                  THEN
                     NEXT_DAY ( TRUNC ( SYSDATE ), 'FRIDAY' )
                  ELSE
                     NULL
               END
                  AS F
        FROM   DELIVERY_DETAILS
        WHERE  SHOP_ID = 0566567890823
        AND    COALESCE ( MON,
                          TUE,
                          WED,
                          THU,
                          FRI )
                  IS NOT NULL) T1,
       (SELECT TO_DATE ( '21-MAR-2014', 'DD-MON-YYYY' ) AS DELIVERY FROM DUAL) T2;

答案 1 :(得分:0)

我首先unpivot数据。

select * from (
  select *
  from delivery_details
  where shop_id = '2171567890878'
  )
unpivot(
    ind for week_day in (
                        mon as 'monday',
                        tue as 'thursday',
                        wed as 'wednesday',
                        thu as 'thursday',
                        fri as 'friday'
                        )
        );

|       SHOP_ID |      CITY | STATE |  WEEK_DAY | IND |
|---------------|-----------|-------|-----------|-----|
| 2171567890878 | ESCONDIDO |    CA | wednesday |   W |
| 2171567890878 | ESCONDIDO |    CA |    friday |   F |

完成此操作后,请使用NEXT_DAY获取下一个取件日期。如果你的 发货日等于发货日,next_day功能会给你一周后的日期。如果您不希望发生这种情况,请使用case语句返回delivery_date。

select shop_id, city, state,
       case when to_char(date'2014-03-21','fmday') = week_day
          then date'2014-03-21'
          else next_day(date'2014-03-21',week_day)
       end pickup_date
from (
  select * from (
    select *
    from delivery_details
    where shop_id = '2171567890878'
    )
  unpivot(
      ind for week_day in (
                        mon as 'monday',
                        tue as 'thursday',
                        wed as 'wednesday',
                        thu as 'thursday',
                        fri as 'friday'
                        )
        )
  );

|       SHOP_ID |      CITY | STATE |                  PICKUP_DATE |
|---------------|-----------|-------|------------------------------|
| 2171567890878 | ESCONDIDO |    CA | March, 26 2014 00:00:00+0000 |
| 2171567890878 | ESCONDIDO |    CA | March, 21 2014 00:00:00+0000 |

然后只需应用MIN即可获得最近的日期。

select min(
       case when to_char(date'2014-03-21','fmday') = week_day
          then date'2014-03-21'
          else next_day(date'2014-03-21',week_day)
       end
       ) pickup_date
from (
  select * from (
    select *
    from delivery_details
    where shop_id = '2171567890878'
    )
  unpivot(
      ind for week_day in (
                        mon as 'monday',
                        tue as 'thursday',
                        wed as 'wednesday',
                        thu as 'thursday',
                        fri as 'friday'
                        )
        )
  );

|                  PICKUP_DATE |
|------------------------------|
| March, 21 2014 00:00:00+0000 |

SQLFiddle