2015-10-07 2 views
0

Я застрял в хранимой процедуре, где мне нужна помощь. У меня есть процедура, в которой она сообщает мне, сколько месяцев или недели или дня было в течение двух дат, но я не знаю, как он вычисляет разницу в день между двумя днями как разницу между «2015-06-01» и « 2015-06-30 'для этого он показывает, что весь месяц или запись - 1 месяц, но для' 2015-06-01 'и' 2015-07-01 'он показывает 1 месяц и 2 дня. Также он вычисляет оставшиеся дни, разделяя их на 7 в течение нескольких недель, но мне нужны календарные недели. Я не в состоянии делать то и другое.Нужна помощь в хранимой процедуре для календарных дней

Это код-

CREATE PROCEDURE GetDateParts 
(
@StartDate DATE , 
@EndDate DATE 
) 
AS 
BEGIN 

    /* variables to be used */ 
    DECLARE @Return VARCHAR(5) 
    /* 
     Get the difference between the two dates 
     add 1 to the value to include the first day in the count 
    */ 
    , @TotalNumberOfDays INT 
    , @DaysInMonth TINYINT; 

    /* table variable to store the number of days in a month 
     this would be better as a fixed SQL table as it'll 
     be called a lot */ 
    DECLARE @Months TABLE 
     ([Month] TINYINT, [NoDays] TINYINT); 

    /* month values */ 
    INSERT INTO @Months 
    VALUES 
     (1, 31), 
     (2, 28), 
     (3, 31), 
     (4, 30), 
     (5, 31), 
     (6, 30), 
     (7, 31), 
     (8, 31), 
     (9, 30), 
     (10, 31), 
     (11, 30), 
     (12, 31); 

    /* Create Result table */ 
    DECLARE @ResultTable TABLE ([MonthNumber] TINYINT, [FullMonth] BIT, [Weeks] TINYINT, [Days] TINYINT) 

    -- set the count as the mointh number 
    DECLARE @Count TINYINT = MONTH(@StartDate); 
    SET @TotalNumberOfDays = DATEDIFF(day, @StartDate, @EndDate)+1 
    WHILE @Count <= MONTH(@EndDate) 
    BEGIN 

     /* get the number of days in the month */ 
     SELECT @DaysInMonth = [NoDays] FROM @Months WHERE [Month] = @Count; 

     /* 
     Check if it's a leap year and alter the number of days in Febuary to 29 
     This was taken from https://www.mssqltips.com/sqlservertip/1527/sql-server-function-to-determine-a-leap-year/ 
     */ 
     IF((SELECT CASE DATEPART(mm, DATEADD(dd, 1, CAST((CAST(@StartDate AS VARCHAR(4)) + '0228') AS DATE))) 
       WHEN 2 THEN 1 
       ELSE 0 
       END) = 1) AND MONTH(@StartDate) = 2 
      SET @DaysInMonth = 29; 

     IF (@TotalNumberOfDays >= @DaysInMonth) 
     BEGIN 
      INSERT INTO @ResultTable ([MonthNumber], [FullMonth]) 
      VALUES (@Count, 1) 

      SET @TotalNumberOfDays = @TotalNumberOfDays - (@DaysInMonth-DAY(@StartDate)); 

      SET @StartDate = DATEADD(day, (@DaysInMonth-DAY(@StartDate)+1), @StartDate); 

      SET @Count = @Count + 1; 
     END 
     ELSE IF (@TotalNumberOfDays >= 7) 
     BEGIN 
      INSERT INTO @ResultTable ([MonthNumber], [Weeks]) 
      VALUES (@Count, CAST(@TotalNumberOfDays/7 AS INT)) 
      DECLARE @Remainder TINYINT = @TotalNumberOfDays%7; 

      IF (@Remainder = 0) 
      BEGIN 
       SET @Count = @Count + 1; 
      END 
      ELSE 
      BEGIN 
       SET @TotalNumberOfDays = @Remainder; 
      END 
     END 
     ELSE 
     BEGIN 
      INSERT INTO @ResultTable ([MonthNumber], [Days]) 
      VALUES (@Count, @TotalNumberOfDays) 
      SET @Count = @Count + 1; 
     END 

    END; 

    -- Return Results 
    SELECT * FROM @ResultTable; 
END 

Может кто-нибудь помочь, как это важно для меня. Thnaks заблаговременно

+0

Может быть просто использовать функцию 'lateiff (wk, @start, @end)', 'lateiff (dd, @start, @end)'? –

+0

Я не могу использовать этот сигнал, это показывает разницу в неделю, даже если разница в дате составляет 4 дня. Я хочу показать только неделю, когда есть разница в 7 дней, и есть полная целая неделя, так как у меня есть неделя данных, чтобы представить не в дни разрыва –

+0

, а затем используйте 'lateiff (dd, @start, @end)/7' для недель. –

ответ

0

В поисках кода необходим вложенный цикл, где Outer While Loop - в течение месяца (который будет проходить через месяцы между Start и End Date), а Inner WHILE Loop будет проходить через число недель в месяце, также проверит, что неделя заполнена, а первый день - дата начала недели. скажем, Дата понедельника. Если это условие не выполняется, заполните таблицу как запись DayWise.

Прокомментировать текст для дальнейшего запроса.

+0

да вот что я хочу ... вы можете мне помочь? –

+0

помогите мне! –

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