【问题标题】:How to get end of month date in progress 4gl如何获得正在进行的月末日期4gl
【发布时间】:2012-06-19 04:29:49
【问题描述】:

我怎样才能得到正在进行的 4gl 月的最后一天?

【问题讨论】:

    标签: progress-4gl


    【解决方案1】:
    /* the last day of this month is one day less than the first day of next month
     *
     * so add one month to the first day of this month and then subtract one day.
     *
     */
    
    function lastDay returns date ( input d as date ):
    
      return add-interval( date( month( d ), 1, year( d )), 1, "month" ) - 1.
    
    end.
    

    【讨论】:

    • add-interval() 需要版本 10 或更高版本。
    【解决方案2】:
    DEF VAR d-Dataa AS DATE NO-UNDO FORMAT "99/99/9999".
    
    DEF VAR c-Datai AS CHAR NO-UNDO.
    
    DEF VAR d-Datai AS DATE NO-UNDO FORMAT "99/99/9999".
    
    DEF VAR c-Dataf AS CHAR NO-UNDO.
    
    DEF VAR d-Dataf AS DATE NO-UNDO FORMAT "99/99/9999".
    
    d-Dataa=TODAY.
    
    c-Datai=("01/" + STRING(MONTH(d-Dataa),"99/") + STRING(YEAR(d-Dataa),"9999")). 
    
    d-Datai=DATE(c-Datai).
    
    IF MONTH(d-Dataa) = 12  THEN
    c-Dataf="01/01/" + STRING(YEAR(d-Dataa) + 1,"9999").    
    
    ELSE
    
    c-Dataf=STRING(DAY(d-Datai),"99/") + STRING(MONTH(d-Dataa)+ 1,"99/") + STRING(YEAR(d-Dataa),"9999").
    
    d-Dataf=DATE(c-Dataf) - 1.
    
    MESSAGE
    
    "Dia Atual: " STRING(d-Dataa, "99/99/9999") SKIP
    "Primeiro dia do Mês: " c-Datai SKIP
    "Ultimo dia do Mês: " STRING(d-Dataf, "99/99/9999") SKIP 
    
    VIEW-AS ALERT-BOX
    

    【讨论】:

      【解决方案3】:

      如果您的平台上没有“间隔” - 这也可以:

      DEFINE VARIABLE start-date      AS DATE         NO-UNDO.
      DEFINE VARIABLE end-of-month    AS DATE         NO-UNDO.
      
      ASSIGN
          start-date = DATE(2, 15, 2012)
          .
      
      ASSIGN
          end-of-month = DATE(MONTH(start-date), 20, YEAR(start-date)) + 15
          end-of-month = end-of-month - DAY(end-of-month)
          .
      

      【讨论】:

      • 如果您的开始日期是 2012 年 3 月 15 日,则会失败。
      【解决方案4】:
      DEF VAR dt-ref          AS DATE     NO-UNDO.
      
      DEF VAR dt-end-of-month AS DATE     NO-UNDO.
      
      ASSIGN dt-ref = DATE(2,12,2012)
      
          .
      
      ASSIGN dt-ref          = dt-ref + 33
      
             dt-end-of-month = DATE(MONTH(dt-ref),1,YEAR(dt-ref)) - 1.
      

      【讨论】:

        【解决方案5】:
        PROCEDURE getEndOfMonth:
            DEFINE INPUT PARAMETER lv-date AS DATE.
            DEFINE OUTPUT PARAMETER lv-monthEnd AS DATE.
        
            lv-monthEnd = DATE(MONTH(lv-date), 31, YEAR(lv-date)) NO-ERROR.
            IF lv-monthEnd = ? THEN DO:
                lv-monthEnd = DATE(MONTH(lv-date), 30, YEAR(lv-date)) NO-ERROR.            
                IF lv-monthEnd = ? THEN DO:
                    lv-monthEnd = DATE(MONTH(lv-date), 29, YEAR(lv-date)) NO-ERROR.            
                    IF lv-monthEnd = ? THEN
                        lv-monthEnd = DATE(MONTH(lv-date), 28, YEAR(lv-date)) NO-ERROR.
                END.
            END. 
        END.
        

        【讨论】:

          【解决方案6】:

          一个简单的,去当月的最后一天,如果失败,最后一天是前一天:

          def var i as int.
          
          def var v_eom as date.
          
          
          Do i = 27 to 31:
          
             v_eom = date(month(today), i, year(today)) no-error.
          
             If error-status:error then do:
          
                 v_eom = date(month(today), (i - 1), year(today)) no-error.
          
                 leave.
          
             End.
          
          End.
          

          【讨论】:

            【解决方案7】:

            将 VAR date1 定义为 DATE INIT 12/12/2015。

            DEFINE VAR datelast AS INT .

            定义 VAR mont AS int.

             mont      = ( MONTH (date1) + 1).
            
             IF mont > 12 THEN 
             DO:
               datelast = 31.
             END.
             ELSE
             DO:
                 datelast  = (DATE(STRING (1) + "/" +   (STRING(mont)) + "/" + STRING( YEAR(date1))) - DATE(STRING((1)) + "/" + STRING(month(date1)) + "/" + STRING( YEAR(date1)))). 
             END.
            
            MESSAGE datelast   VIEW-AS ALERT-BOX INFO BUTTONS OK.
            

            【讨论】:

              【解决方案8】:

              最简单的方法是使用 ADD-INTERVAL 函数。

              ldEndDate = ADD-INTERVAL(ldBeginDate, 1, "months") - 1.
              

              【讨论】:

                【解决方案9】:

                DEFINE VARIABLE given-date AS DATE NO-UNDO .

                PROMPT-FOR 给定日期。

                DISP DAY(add-interval( date( month( INPUT given-date), 1, year( INPUT given-date)), 1, "month" ) - 1) label "Lastdate"。

                【讨论】:

                  【解决方案10】:

                  应该这样做。

                  DEFINE VARIABLE InputDate           AS DATE        NO-UNDO.
                  DEFINE VARIABLE OutputDate          AS DATE        NO-UNDO.
                  
                  IF MONTH(InputDate) = 12 THEN
                      ASSIGN OutputDate = DATE(1,1,(YEAR(InputDate) + 1 ) ) - 1 .
                  ELSE 
                      ASSIGN OutputDate = DATE((MONTH(InputDate) + 1 ), 1,YEAR(InputDate) ) - 1.
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2021-07-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-12-14
                    • 1970-01-01
                    相关资源
                    最近更新 更多