选择将来的日期

时间:2011-10-27 16:47:53

标签: sql

我正在处理货件交付报告,以确定是否在装运窗口内发货。

每个版本都有一个Ship_Date值,该值是发布必须发布的日期。有些版本虽然有一个较晚的窗口整数值,但是如果货物是在X天内完成的,那么仍然可以按时考虑。

另一个表保存了本月的有效发货日期(用于排除假期,周末等),这很复杂。

Order_Releases_Table
  Part_No,
  Quantity,
  Ship_Date,
  Window

Shipping_Date
  Shipping_Day

样本数据

Order_Releases_Table
Part_No  Quantity  Ship_Date  Window
ABC      100       9/1/2011   0
XYZ      200       9/1/2011   2

Shipping_Date
9/1/2011
9/2/2011
9/5/2011

因此,对于这个数据部分,ABC必须在9/1发货才能按时考虑。部分XYZ虽然可以在9/1之后最多2天发货并仍然按时考虑,但由于9/3不在我们的发货日期,那么9/5是它可以发货的最后一天,仍然可以按时考虑

我认为答案在于加入发货日表的子查询,该表将行号分配给shipping_day字段。

SELECT
  Row_Number() OVER(ORDER BY Shipping_Date) AS Day_No,
  Shipping_day
FROM Shipping_Date
WHERE Shipping_Day > Ship_Date

RETURNS
Day_No  Shipping_Day
1       9/2/2011
2       9/5/2011

然后,如果我只是选择此子查询中的Day_No等于发布的窗口值的日期,那么我就可以发送特定货件的最后一天,并且仍然可以按时考虑。

我很难把它全部包装到最后的查询中。

这是解决问题的正确方法吗?

1 个答案:

答案 0 :(得分:3)

也许这会让你开始:

DECLARE @t TABLE (Part CHAR(3), ShipDate DATETIME, Window INT)
DECLARE @ship TABLE (ShipDate DATETIME)

INSERT INTO @t
        ( Part, ShipDate, Window )
SELECT 'abc', '20110901', 0
UNION
SELECT 'xyz', '20110901', 2


INSERT INTO @ship
        ( ShipDate )
SELECT   '20110901'  
UNION
SELECT '20110905'
UNION
SELECT '20110910'


SELECT Part, ShipDate, Window,
    (SELECT MIN(ShipDate) AS NextShip
      FROM @ship S 
      WHERE s.shipDate >= DATEADD(day, t.Window, t.shipDate))
FROM @t t