SQL查询中的DateDiff和Case运算符

问题描述 投票:0回答:1

我正在尝试创建一个报告,帮助我们确定我们按时交付订单的方式,但我对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

任何帮助将不胜感激。

sql sql-server datediff
1个回答
0
投票

这是一个较短的表单,用于计算您所声明的条件的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设置无关。

您可能还想考虑将公共假期考虑在内并为此添加条件。

© www.soinside.com 2019 - 2024. All rights reserved.