2015-01-26 7 views
1

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, то это день отправки. Если время больше, мне нужно проверить на следующий день, который соответствует критериям времени отправки, а затем добавить день на дату ввода в качестве вывода. Dis_times, который равен 00:00:00, указывает, что для этого дня не установлено никакого времени, и этот день не является днем ​​отправки. Я мог бы изменить это на 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

Так что мне нужно, это способ, чтобы найти следующий день для отправки, это также может быть, как это будет на следующей неделе, если, например, в частности. дата/день - воскресенье, а на следующий день - вторник на следующей неделе, которая соответствует критериям времени отправки.

Я пробовал использовать CTE с LAG и LEAD, но это не стоит публиковать, поскольку он полностью отключен.

ответ

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] 
+0

Благодаря миллион он работал как шарм! Я только что добавил SET DATEFIRST 1, так как понедельник - первый день недели, который я использую :) – Flex

Смежные вопросы