2016-11-13 4 views
0

пытаюсь вычислить из-за дату, используя дату счета с помощью следующих ограниченийНужна помощь в расчете Due Date с помощью функции SQL Server

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

  • если день месяца составляет 4 и день до истечения соответствующего месяца 5, мы должны рассчитать значения путем вычитания 4 и 5, если вычитаемое значение равно -ve 1, а если дата счета-фактуры введено 13.11.2016, поэтому срок должен быть 12/04/2017 (здесь 04 - день месяца)

  • если день месяца составляет 15 и день до истечения соответствующего месяца 5, а вычитаемое значение равно 10 (не отрицательное), указанная дата выставления счета - 13.11.2016 означает, что срок должен быть 12/15/2016 (здесь 15 день месяца), если дата счета меньше или равно вычитают значение, т.е. 10, как дата выставления счета 11/09/2016, то дата счета-фактуры должны быть 11/15/2016

Примечание вышеуказанные ограничения также должны удовлетворять високовому году при расчете дат фьюга

Пожалуйста, помогите мне стать новым пчелом для функций SQL-сервера

Кодекс, который я Пробовал

DECLARE @INVOICEDATE DATETIME ='02/01/2016' 
     ,@TENANTID BIGINT=29 
     ,@PAYMENTTERMID BIGINT=2 

BEGIN 
    DECLARE @DUEDATE DATETIME 
    DECLARE @ACTUALDUEDATE BIGINT 
    DECLARE @CALCULATEDDATE DATETIME 
    DECLARE @PAYMENTTYPES BIGINT 
    DECLARE @DAYSOFMONTH BIGINT 
    DECLARE @DAYSAFTERDUEDAY BIGINT 
    DECLARE @NOOFDAYS BIGINT 

    SELECT @PAYMENTTYPES = PAYMENT_TYPES 
     ,@NOOFDAYS = NUMBER_OF_DAYS 
     ,@DAYSOFMONTH = DAY_OF_MONTH 
     ,@DAYSAFTERDUEDAY = DAYS_AFTER_DUE_DAY 
     FROM XC_PAYMENT_TERMS_MASTER 
     WHERE TENANT_ID = @TENANTID 
     AND PAYMENT_TERM_ID = @PAYMENTTERMID 

    IF @PAYMENTTYPES = 1 
    BEGIN 
     SET @CALCULATEDDATE = DATEADD(dd, @NOOFDAYS, @INVOICEDATE) 
    END 
    ELSE IF @PAYMENTTYPES = 2 
    BEGIN 
     SET @ACTUALDUEDATE = @DAYSOFMONTH - @DAYSAFTERDUEDAY 
      IF 1 = (
      IIF(DATEPART(dd, (
         EOMONTH(CONCAT (
           DATEPART(yyyy, @INVOICEDATE) 
           ,'0201' 
         )) 
       )) = 29, 1, 0) 
      ) 
      --LEAP YEAR 
      BEGIN 
      IF(@ACTUALDUEDATE <= 0) 
      BEGIN 
      IF DATEPART(dd, @INVOICEDATE) = 30 
      AND DATEPART(mm, @INVOICEDATE) =01 
      BEGIN 
      SET @CALCULATEDDATE=DATEADD(dd, 31, @INVOICEDATE) 
      END 
      ELSE IF DATEPART(dd, @INVOICEDATE) = 31 
      AND DATEPART(mm, @INVOICEDATE) =01 
      BEGIN 
      SET @CALCULATEDDATE=DATEADD(dd, 31, @INVOICEDATE) 
      END 
      ELSE 
      BEGIN 
      IF @DAYSOFMONTH = 30 OR @DAYSOFMONTH =31 
      BEGIN 
      SET @CALCULATEDDATE= DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0, @INVOICEDATE)+2,0)) 
      END 
      ELSE 
      BEGIN 
      DECLARE @NEWNEGATIVEDATE DATETIME 
      SET @NEWNEGATIVEDATE = DATEADD(DAY, @DAYSOFMONTH - DATEPART(DAY, @INVOICEDATE), @INVOICEDATE); 
      SET @DUEDATE = DATEADD(mm, 1, @NEWNEGATIVEDATE) 
      END 
      END 
      END 
      ELSE IF(@ACTUALDUEDATE > 0) 
      BEGIN 
      SELECT 2 
      DECLARE @COMBINEDDATE DATETIME 
      SET @COMBINEDDATE=DATEADD(DAY, @ACTUALDUEDATE - DATEPART(DAY, @INVOICEDATE), @INVOICEDATE); 
      SELECT @INVOICEDATE AS INVDATE 
      SELECT @COMBINEDDATE AS COMBDATE 
      IF @INVOICEDATE > @COMBINEDDATE 
      BEGIN 
      SELECT 115 AS TRUE 
      DECLARE @NEWDATE DATETIME 
      SET @NEWDATE = DATEADD(DAY, @DAYSOFMONTH - DATEPART(DAY, @INVOICEDATE), @INVOICEDATE); 
      SET @DUEDATE = DATEADD(mm, 1, @NEWDATE) 
      SELECT @DUEDATE AS DATES 
      END 

      ELSE 
      BEGIN 
      SET @DUEDATE=DATEADD(DAY, @DAYSOFMONTH - DATEPART(DAY, @INVOICEDATE), @INVOICEDATE); 
      SELECT @DUEDATE AS DATEDUE 
      END 

      END 
      END 
      ELSE 
      --NOT LEAP YEAR 
      BEGIN 

      END 

     END 
     END 
+0

Как насчет показать нам, что вы пробовали, чтобы решить эту проблему, то мы поможем вам. Измените вопрос и добавьте SQL, который у вас есть. –

+0

@ R.Richards см. Код в отредактированном сообщении –

ответ

0

Наконец, решаемые его, создавая следующие функции

CREATE FUNCTION [dbo].[XC_CALCULATE_DUE_DATE] (
    @INVOICEDATE DATETIME 
    ,@TENANTID BIGINT 
    ,@PAYMENTTERMID BIGINT 
    ) 
RETURNS DATETIME 
AS 
BEGIN 
    DECLARE @DAYOFMONTH BIGINT 
    DECLARE @DAYOFNEXTMONTH BIGINT 
    DECLARE @PAYMENTTYPES BIGINT 
    DECLARE @NOOFDAYS BIGINT 

    SELECT @PAYMENTTYPES = PAYMENT_TYPES 
     ,@NOOFDAYS = NUMBER_OF_DAYS 
     ,@DAYOFMONTH = DAY_OF_MONTH 
     ,@DAYOFNEXTMONTH = DAYS_AFTER_DUE_DAY 
    FROM XC_PAYMENT_TERMS_MASTER 
    WHERE TENANT_ID = @TENANTID 
     AND PAYMENT_TERM_ID = @PAYMENTTERMID 

    DECLARE @DIFFERENCE BIGINT = ISNULL(@DAYOFMONTH, 0) - ISNULL(@DAYOFNEXTMONTH, 0) 
    DECLARE @DUEDATE DATETIME 
    DECLARE @ACTUALDUEDATE BIGINT 
    DECLARE @CALCULATEDDATE DATETIME 

    IF @PAYMENTTYPES = 1 
    BEGIN 
     SET @DUEDATE = DATEADD(dd, @NOOFDAYS, @INVOICEDATE) 
    END 
    ELSE IF @PAYMENTTYPES = 2 
    BEGIN 
     DECLARE @LEAPYEAR TINYINT = IIF(DATEPART(dd, (
         EOMONTH(CONCAT (
           DATEPART(yyyy, @INVOICEDATE) 
           ,'0201' 
           )) 
         )) = 29, 1, 0) 

     IF @DIFFERENCE <= 0 
     BEGIN 
      DECLARE @STARTINGDATE DATETIME 
      DECLARE @NEWDATE DATETIME 
      DECLARE @NEXTMONTH DATETIME 

      IF 1 = @LEAPYEAR 
      BEGIN 
       SET @STARTINGDATE = DATEADD(month, DATEDIFF(month, 0, @INVOICEDATE), 0) 
       SET @NEXTMONTH = DATEADD(MONTH, 1, @STARTINGDATE) 

       IF 1 = DATEPART(MONTH, @INVOICEDATE) 
       BEGIN 
        IF @DAYOFMONTH = 30 
        BEGIN 
         SET @DUEDATE = DATEADD(month, DATEDIFF(month, 0, DATEADD(MONTH, 2, @INVOICEDATE)), 0) 
        END 
        ELSE IF @DAYOFMONTH = 31 
        BEGIN 
         SET @DUEDATE = DATEADD(DAY, 1, DATEADD(month, DATEDIFF(month, 0, DATEADD(MONTH, 2, @INVOICEDATE)), 0)) 
        END 
        ELSE 
        BEGIN 
         SET @DUEDATE = DATEADD(DAY, @DAYOFMONTH - 1, @NEXTMONTH) 
        END 
       END 
       ELSE 
       BEGIN 
        SET @DUEDATE = DATEADD(DAY, @DAYOFMONTH - 1, @NEXTMONTH) 
       END 
      END 
      ELSE 
      BEGIN 
       SET @STARTINGDATE = DATEADD(month, DATEDIFF(month, 0, @INVOICEDATE), 0) 
       SET @NEXTMONTH = DATEADD(MONTH, 1, @STARTINGDATE) 

       IF 1 = DATEPART(MONTH, @INVOICEDATE) 
       BEGIN 
        IF @DAYOFMONTH = 29 
        BEGIN 
         SET @DUEDATE = DATEADD(month, DATEDIFF(month, 0, DATEADD(MONTH, 2, @INVOICEDATE)), 0) 
        END 
        ELSE IF @DAYOFMONTH = 30 
        BEGIN 
         SET @DUEDATE = DATEADD(DAY, 1, DATEADD(month, DATEDIFF(month, 0, DATEADD(MONTH, 2, @INVOICEDATE)), 0)) 
        END 
        ELSE IF @DAYOFMONTH = 31 
        BEGIN 
         SET @DUEDATE = DATEADD(DAY, 2, DATEADD(month, DATEDIFF(month, 0, DATEADD(MONTH, 2, @INVOICEDATE)), 0)) 
        END 
        ELSE 
        BEGIN 
         SET @DUEDATE = DATEADD(DAY, @DAYOFMONTH - 1, @NEXTMONTH) 
        END 
       END 
       ELSE 
       BEGIN 
        SET @DUEDATE = DATEADD(DAY, @DAYOFMONTH - 1, @NEXTMONTH) 
       END 
      END 
     END 
     ELSE 
     BEGIN 
      DECLARE @SDATES DATETIME = DATEADD(month, DATEDIFF(month, 0, @INVOICEDATE), 0) 
      DECLARE @NMONTH DATETIME = DATEADD(MONTH, 1, @SDATES) 

      IF DATEPART(DD, @INVOICEDATE) > @DIFFERENCE 
      BEGIN 
       IF @DAYOFMONTH > 30 
        AND DATEPART(DD, @INVOICEDATE) <> @DIFFERENCE 
       BEGIN 
        SET @DUEDATE = DATEADD(s, - 1, DATEADD(mm, DATEDIFF(m, 0, @NMONTH) + 1, 0)) 
       END 
       ELSE 
       BEGIN 
        SET @DUEDATE = DATEADD(DAY, @DAYOFMONTH - 1, @NMONTH) 
       END 
      END 
      ELSE 
      BEGIN 
       IF @DAYOFMONTH > 30 
        AND DATEPART(DD, @INVOICEDATE) <> @DIFFERENCE 
       BEGIN 
        SET @DUEDATE = DATEADD(s, - 1, DATEADD(mm, DATEDIFF(m, 0, @NMONTH) + 1, 0)) 
       END 
       ELSE IF @DAYOFMONTH > 30 
        AND DATEPART(DD, @INVOICEDATE) = @DIFFERENCE 
       BEGIN 
        SET @DUEDATE = DATEADD(s, - 1, DATEADD(mm, DATEDIFF(m, 0, @SDATES) + 1, 0)) 
       END 
       ELSE 
       BEGIN 
        SET @DUEDATE = DATEADD(DAY, @DAYOFMONTH - 1, @SDATES) 
       END 
      END 

      IF 1 = @LEAPYEAR 
      BEGIN 
       IF 1 = DATEPART(MONTH, @INVOICEDATE) 
        AND DATEPART(DD, @INVOICEDATE) <> @DIFFERENCE 
       BEGIN 
        IF @DAYOFMONTH > 29 
        BEGIN 
         SET @DUEDATE = DATEADD(s, - 1, DATEADD(mm, DATEDIFF(m, 0, @NMONTH) + 1, 0)) 
        END 
       END 
      END 
      ELSE 
      BEGIN 
       IF 1 = DATEPART(MONTH, @INVOICEDATE) 
        AND DATEPART(DD, @INVOICEDATE) <> @DIFFERENCE 
       BEGIN 
        IF @DAYOFMONTH >= 29 
        BEGIN 
         SET @DUEDATE = DATEADD(s, - 1, DATEADD(mm, DATEDIFF(m, 0, @NMONTH) + 1, 0)) 
        END 
       END 
      END 
     END 
    END 

    RETURN @DUEDATE 
END