我正在尝试创建一个报告,帮助我们确定我们按时交付订单的方式,但我对SQL很新,并且不太确定如何实现我需要的东西。
我们的目标是在当天中午12点之前发送工作日的订单。对于在工作日或周末中午12点之后下达的订单,我们的目标是在下一个工作日(周一至周五)发货。
我有一个初始SQL查询,显示所有正确的列,并有一个CASE操作符,但这只是检查订单是否在24小时内发货,但没有考虑订单下订单或在哪一天。
CASE WHEN DATEDIFF(day,order_datetime,delivery_datetime)<=1
THEN 1
ELSE 0
END AS Ontime_infull
如果我们达到交付目标,则Ontime_infull参数应为1,如果失败则为0。我确信这可以通过嵌套的CASE,WHEN和其他方式实现,但不知道该怎么做。
我已经使用了以下代码,我认为它现在正在运行,但是对于是否可以改进此代码获得任何反馈都很好...
CASE
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Monday' AND DATEPART(hh,order_header_detail.ohd_input_datetime) < 12 AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) =0 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Monday' AND DATEPART(hh,order_header_detail.ohd_input_datetime) >= 12 AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) <=1 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Tuesday' AND DATEPART(hh,order_header_detail.ohd_input_datetime) < 12 AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) =0 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Tuesday' AND DATEPART(hh,order_header_detail.ohd_input_datetime) >= 12 AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) <=1 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Wednesday' AND DATEPART(hh,order_header_detail.ohd_input_datetime) < 12 AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) =0 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Wednesday' AND DATEPART(hh,order_header_detail.ohd_input_datetime) >= 12 AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) <=1 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Thursday' AND DATEPART(hh,order_header_detail.ohd_input_datetime) < 12 AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) =0 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Thursday' AND DATEPART(hh,order_header_detail.ohd_input_datetime) >= 12 AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) <=1 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Friday' AND DATEPART(hh,order_header_detail.ohd_input_datetime) < 12 AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) =0 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Friday' AND DATEPART(hh,order_header_detail.ohd_input_datetime) >= 12 AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) <=3 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Saturday' AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) <=2 THEN 1
WHEN DATENAME(dw,order_header_detail.ohd_input_datetime) = 'Sunday' AND DATEDIFF(Day,order_header_detail.ohd_input_datetime,delivery_header.dh_datetime) <=1 THEN 1
ELSE 0
END AS Ontime_infull
任何帮助将不胜感激。
这是一个较短的表单,用于计算您所声明的条件的Ontime_infull标志:
case when
-- same day delivery is always OK
(datediff(dd, order_datetime, delivery_datetime) = 0)
-- next day deliver is OK if order is after midday
or ((datepart(hh, order_datetime) >= 12 and datediff(dd, order_datetime, delivery_datetime) = 1))
-- delivery on the following Monday is OK if ordered after midday on Friday
or (
(datepart(hh, order_datetime) >= 12 and datediff(dd, order_datetime, delivery_datetime) <= 3)
and (((datepart(dw, order_datetime) + @@DATEFIRST + 5) % 7 + 1) >= 5) -- Friday or later
and (((datepart(dw, delivery_datetime) + @@DATEFIRST + 5) % 7 + 1) = 1) -- Monday
)
then 1
else 0
datepart(dw, order_datetime) + @@DATEFIRST + 5) % 7 + 1
构造计算从1(星期一)到7(星期日)的星期数,与SET DATEFIRST
设置无关。
您可能还想考虑将公共假期考虑在内并为此添加条件。