2016-12-20 2 views
3

Я использую приведенный ниже код SQL в MS SSMS, чтобы найти дату окончания недели. Мне часто приходится переключаться между средой и воскресенью как день окончания недели. Боковое замечание, мои наборы данных часто находятся в 100 000.Эффективный способ определения даты окончания недели без таблицы календаря

Есть ли более эффективный способ сделать это, чем то, что у меня ниже, чем использование таблицы календаря?

/* Declare Variables */ 
DECLARE @WeekendingDay VARCHAR(10); 
DECLARE @DayNumber INT; 
DECLARE @InputDate VARCHAR(10); 
DECLARE @conInputDate DATETIME; 
DECLARE @outWeekending DATETIME; 
DECLARE @CovertToInt VARCHAR(10); 

/* --------------------Inputs-------------------- */ 

/* uncomment the weekending day you want */ 
--Set @WeekendingDay = 'Monday' 
--Set @WeekendingDay = 'Tuesday' 
--Set @WeekendingDay = 'Wednesday' 
--Set @WeekendingDay = 'Thursday' 
--Set @WeekendingDay = 'Friday' 
--Set @WeekendingDay = 'Saturday' 
SET @WeekendingDay = 'Sunday'; 

/* Date you want the weekending of */    
SET @InputDate = '29/12/2016'; 

/* --------------------Process-------------------- */ 
SET @DayNumber = CASE @WeekendingDay 
        WHEN 'Sunday' THEN 1 
        WHEN 'Monday' THEN 2 
        WHEN 'Tuesday' THEN 3 
        WHEN 'Wednesday' THEN 4 
        WHEN 'Thursday' THEN 5 
        WHEN 'Friday' THEN 6 
        WHEN 'Saturday' THEN 7 
       END; 


SET @conInputDate = CONVERT(DATETIME, @InputDate, 103); 
SET @outWeekending = DATEADD(dd, 
          CASE WHEN DATEPART(DW, @conInputDate) = @DayNumber 
            THEN 0 
            ELSE -1 * DATEPART(DW, @conInputDate) + 7 
             + @DayNumber 
          END, @conInputDate); 

/* --------------------Output-------------------- */ 
PRINT @outWeekending; 
+0

Этот вопрос будет привлекать много мнений, что приводит к закрытию, но если вы вызываете это много, то я бы рассматривать календарную таблицу все даты из (некоторых дат) до (некоторых будущих дат, года от теперь), который имеет начало и конец недели на основе любой комбинации. Его нужно будет вычислить только один раз ... затем вы можете запросить его или присоединиться к нему с этого момента и сэкономить много времени. – scsimon

+0

Вы хотите рассчитать дату окончания недели для каждой из 100 000 записей? Является ли выражение, входящее в состав SQL-запроса на основе набора? – Cato

+0

вы можете сэкономить один случай, установив DayNumber direct вместо перехода на WeekendDay, но он не спасет вас в любое время. – GuidoG

ответ

1

Это даст вам понедельник недели. В зависимости от того, в какой день вы хотите использовать в качестве конца, вы можете отрегулировать его по мере необходимости.

DECLARE @date DATETIME = GETUTCDATE()-5 

SELECT 
    @date 
    ,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0) --Monday 
    ,DATEADD(DD,1,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0)) --Tuesday 
    ,DATEADD(DD,2,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0)) --Wednesday 
    ,DATEADD(DD,3,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0)) --Thursday 
    ,DATEADD(DD,4,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0)) --Friday 
    ,DATEADD(DD,5,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0)) --Saturday 
    ,DATEADD(DD,6,DATEADD(WEEK, DATEDIFF(WEEK, 0, @date),0)) --Sunday 
+0

Спасибо за ответ. Я еще не запустил это, но если бы был понедельник, будет ли он показывать следующий понедельник или текущий понедельник в конце недели? –

+0

Это даст понедельник недели с даты. Поэтому, если @date был в понедельник, это дало бы тот день. Если бы это был вторник, это было бы накануне. Отрегулируйте его на воскресенье, и, если побег в понедельник, вы получите следующее воскресенье. Если бы он побежал в воскресенье, это дало бы тот день. –

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