计算发货的发货日期

时间:2015-01-26 23:57:24

标签: sql-server tsql datetime

SQL Server

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

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

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

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

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

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,但它不值得发布,因为它完全关闭。

1 个答案:

答案 0 :(得分:0)

试试这个

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]