我有一个场景,我必须根据系统中的交付日期获取接收日期。
我所指的样本系统是购物车,对于每个订单,接收日期可以是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',提货将在下周一最近
非常感谢
答案 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 |