计算装运的发货日

Calculate dispatch day for shipment

SQL 服务器

CREATE TABLE [dbo].[DispatchTime]
(
     [dis_ID] [int] IDENTITY(1,1) NOT NULL,
     [dis_fk_pro] [int] NOT NULL,
     [dis_weekDay] [tinyint] NOT NULL,
     [dis_displayDay] [varchar](12) NULL,
     [dis_time] [time](0) NOT NULL,

     CONSTRAINT [PK_DispatchTime] PRIMARY KEY (dis_ID)
)

http://i.stack.imgur.com/o688Q.png

我有一个 table,其中包含有关工作日派送时间的信息。 查询的输入是日期时间,例如 '2015-01-27 13:30:00'

我的想法是,从日期时间开始,我应该确定将在哪一天发货。逻辑是从日期开始,如果是,例如。如本例中的星期二,并且时间小于或等于 dis_time 中的时间,那么这是发货日。如果时间更长,我需要检查符合调度时间标准的第二天,然后将该日期添加到输入日期作为输出。 dis_time即00:00:00表示当天没有设置时间,当天不是调度日。我可以将其更改为 NULL,但现在是这样。

我尝试了很多东西,每次尝试都会变得更糟。

我知道我可以找到并匹配输入的日期和时间,并据此做很多 if 测试,但我没有成功得到我描述的结果。

DECLARE @fromTime AS datetime
SET DATEFIRST 1
SET @fromTime = '2015-01-27 13:30:00

SELECT *
FROM DispatchTime
WHERE dis_weekDay = DATEPART(dw,@fromTime)

http://i.stack.imgur.com/8fosr.png

所以我需要的是找到第二天发货的方法,也可能是下周发货,例如例如日期/日期是星期日,然后是满足派送时间标准的下一周的星期二。

我尝试过使用带有 LAG 和 LEAD 的 CTE,但它不值得发布,因为它完全关闭了。

试试这个

IF OBJECT_ID('Tempdb..#DispatchTime') IS NOT NULL 
    DROP TABLE #DispatchTime
CREATE TABLE #DispatchTime
    (
      [dis_ID] INT IDENTITY(1, 1) ,
      [dis_fk_pro] INT ,
      [dis_weekDay] TINYINT ,
      [dis_displayDay] VARCHAR(12) ,
      [dis_time] TIME(0)
    )

INSERT  INTO #DispatchTime
        ( dis_fk_pro, dis_weekDay, dis_displayDay, dis_time )
VALUES  ( 1, 1, 'Monday', '00:00:00' ),
        ( 1, 2, 'Tuesday', '13:30:00' ),
        ( 1, 3, 'Wednesday', '12:30:00' ),
        ( 1, 4, 'Thursday', '12:30:00' ),
        ( 1, 5, 'Friday', '12:30:00' ),
        ( 1, 6, 'Saturday', '00:00:00' ),
        ( 1, 7, 'Sunday', '00:00:00' )


DECLARE @fromTime AS DATETIME
SET @fromTime = '2015-01-27 12:30:00'

SELECT TOP 1
        DT.dis_ID ,
        DT.dis_fk_pro ,
        DT.dis_weekDay ,
        DT.dis_displayDay ,
        DT.dis_time ,
        CASE WHEN DT.dis_weekDay >= DATEPART(dw, @fromTime)
             THEN DATEADD(d, DT.dis_weekDay - DATEPART(dw, @fromTime),
                          CONVERT(DATE, @fromTime))
             ELSE DATEADD(d, DT.dis_weekDay - DATEPART(dw, @fromTime) + 7,
                          CONVERT(DATE, @fromTime))
        END AS [Possible Dispatch Date]
FROM    #DispatchTime AS DT
WHERE   CONVERT(TIME, @fromTime) <= DT.dis_time
ORDER BY [Possible Dispatch Date]