代码之家  ›  专栏  ›  技术社区  ›  Andrew

使用sys.anydata.convertdate获取上个月的第一天和最后一天

  •  -1
  • Andrew  · 技术社区  · 6 年前

    我想得到上个月的第一天和最后一天使用 SYS.ANYDATA.CONVERTDATE(TRUNC(SYSDATE,'MM')) 因为它只允许我通过使用 SYS.ANYDATA.CONVERTDATE .

    ARGUMENT_NAME 对于 IN_DATE_FROM_DTS 我想把上个月的第一天 DEFAULT_VALUE 参数。在 议名 对于 IN_DATE_TO_DTS 我想把上个月的最后一天 默认值 参数。

    SYS.DBMS_SCHEDULER.DEFINE_ANYDATA_ARGUMENT(
            PROGRAM_NAME => 'TST_PW',
            ARGUMENT_NAME => 'IN_DATE_FROM_DTS',
            ARGUMENT_POSITION => 7,
            ARGUMENT_TYPE => 'DATE',
            DEFAULT_VALUE => ''
            );
        DBMS_SCHEDULER.DEFINE_ANYDATA_ARGUMENT(
            PROGRAM_NAME => 'TST_PW',
            ARGUMENT_NAME => 'IN_DATE_TO_DTS',
            ARGUMENT_POSITION => 8,
            ARGUMENT_TYPE => 'DATE',
            DEFAULT_VALUE => ''
            );
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Alex Poole    6 年前

    我只需要修改条件sys.anydata.convertdate(trunc(sys date,'mm'))就可以得到上个月的第一个日期和最后一个日期。

    所以实际上,你只是问如何得到上个月的第一天和最后一天,而不是你得到的当月的第一天。 TRUNC(SYSDATE,'MM') .

    你可以使用 add_months() last_day() 功能。要查看当前月份的第一天和最后一天,可以使用:

    select sysdate as raw_date,
      trunc(sysdate, 'MM') as first_of_month,
      last_day(trunc(sysdate)) as last_of_month
    from dual;
    
    RAW_DATE            FIRST_OF_MONTH      LAST_OF_MONTH      
    ------------------- ------------------- -------------------
    2018-09-18 10:30:33 2018-09-01 00:00:00 2018-09-30 00:00:00
    

    上个月:

    select add_months(sysdate, -1) as raw_date,
      trunc(add_months(sysdate, -1), 'MM') as first_of_month,
      last_day(trunc(add_months(sysdate, -1))) as last_of_month
    from dual;
    
    RAW_DATE            FIRST_OF_MONTH      LAST_OF_MONTH      
    ------------------- ------------------- -------------------
    2018-08-18 10:30:33 2018-08-01 00:00:00 2018-08-31 00:00:00
    

    AS anydata 然后可以使用:

    sys.anydata.convertdate(trunc(add_months(sysdate, -1), 'MM'))
    sys.anydata.convertdate(last_day(trunc(add_months(sysdate, -1))))
    

    所以:

    select sys.anydata.convertdate(trunc(add_months(sysdate, -1),'MM'))  as first_of_month,
      sys.anydata.convertdate(last_day(trunc(add_months(sysdate, -1)))) as last_of_month
    from dual;
    
    FIRST_OF_MONTH()
    ------------------------------------------------------------------------------------------------------------------------
    LAST_OF_MONTH()
    ------------------------------------------------------------------------------------------------------------------------
    ANYDATA()
    ANYDATA()
    

    转换回实际显示日期:

    select sys.anydata.convertdate(trunc(add_months(sysdate, -1), 'MM')).accessdate()
        as first_of_month,
      sys.anydata.convertdate(last_day(trunc(add_months(sysdate, -1)))).accessdate()
        as last_of_month
    from dual;
    
    FIRST_OF_MONTH      LAST_OF_MONTH      
    ------------------- -------------------
    2018-08-01 00:00:00 2018-08-31 00:00:00
    
        2
  •  1
  •   Nikhil    6 年前

    这将适用于前几个月:

    select trunc(add_months(sysdate,-1), 'MM'),last_day(add_months(sysdate,-1)) from dual;
    

    样品输出:

    01-08-18    31-08-18
    

    为了赢得胜利,将是:

    select TO_CHAR((select trunc(add_months(sysdate,-1), 'MM') from dual), 
    'DAY') ,TO_CHAR((select 
    last_day(add_months(sysdate,-1)) from dual), 'DAY')from dual;
    

    样品输出:

    WEDNESDAY   FRIDAY   
    
    推荐文章