2016-11-13 112 views
0

正在尝试通过以下限制使用发票日期来计算到期日需要使用SQL Server的功能

  • 将有两个文本框一个是输入月份的一天,另一种是计算截止日期援助输入前一个月的前一天

  • 如果月份的日期为4且到期月份的前一天的日期为5,我们必须通过减去4和5来计算值,如果减去的值为-ve 1并且发票日期输入的是2016年11月13日,以便截止日期必须是2017年4月12日(这里是每月的一天)

  • 如果月份的日期为15,且到期月份的日期为5并且扣除的值为10(非负值),则输入的发票日期为11/13/2016表示到期日期必须为12/15/2016 (这里是15月的一天),如果发票日期小于或等于像发票日期2016年11月9日减去值即10,则发票日期必须二○一六年十一月一十五日

注以上约束条件还必须满足闰年的同时计算日期

请帮我看看新的蜜蜂来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