计算装运的发货日
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]
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]