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