更新时间:2022-08-16 GMT+08:00

日期函数

本节介绍如下日期函数:

ADD_MONTHS

ADD_MONTHS是Oracle系统函数,GaussDB(DWS)中并不隐式支持该函数。

在使用此函数之前,请执行如下操作:

  1. 创建并使用MIG_ORA_EXT模式。
  2. 复制custom scripts文件的内容,并在要执行迁移的所有目标数据库中执行此脚本。详情请参见迁移流程

ADD_MONTHS返回带月份的日期。

  • date参数为datetime类型。
  • integer参数为integer类型。

返回类型为date。

输入:ADD_MONTHS

SELECT
          TO_CHAR( ADD_MONTHS ( hire_date ,1 ) ,'DD-MON-YYYY' ) "Next month"
     FROM
          employees
     WHERE
          last_name = 'Baer'
;

输出

SELECT
          TO_CHAR( MIG_ORA_EXT.ADD_MONTHS ( hire_date ,1 ) ,'DD-MON-YYYY' ) "Next month"
     FROM
          employees
     WHERE
          last_name = 'Baer'
;

TO_DATE(使用第三个参数)

TO_DATE(' 2019-05-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')中的第三个参数需要加注释。

输入

 CREATE TABLE PRODUCT
     ( prod_id       INTEGER      
     , prod_code     VARCHAR(5)   
     , prod_name     VARCHAR(100)
     , unit_price    NUMERIC(6,2) NOT NULL
     , manufacture_date  DATE DEFAULT sysdate )
 PARTITION BY RANGE (manufacture_date)
 (PARTITION "P_20190501"  VALUES LESS THAN (TO_DATE(' 2019-05-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 
  );

输出

 CREATE TABLE PRODUCT
     ( prod_id       INTEGER      
     , prod_code     VARCHAR(5)   
     , prod_name     VARCHAR(100)
     , unit_price    NUMERIC(6,2) NOT NULL
     , manufacture_date  DATE DEFAULT sysdate )
 PARTITION BY RANGE (manufacture_date)
 (PARTITION "P_20190501"  VALUES LESS THAN (TO_DATE(' 2019-05-02 00:00:00', 'YYYY-MM-DD HH24:MI:SS'/* , 'NLS_CALENDAR=GREGORIAN' */)) 
  );

TO_DATE(使用SYYYY年份格式)

日期格式不支持SYYYY,适用GaussDB T。

输入

CREATE TABLE PRODUCT
     ( prod_id       INTEGER      
     , prod_code     VARCHAR(5)   
     , prod_name     VARCHAR(100)
     , unit_price    NUMERIC(6,2) NOT NULL
     , manufacture_date  DATE DEFAULT sysdate )
 PARTITION BY RANGE (manufacture_date)
 (PARTITION "P_20190501"  VALUES LESS THAN (TO_DATE(' 2019-05-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')) 
  );

输出

CREATE TABLE PRODUCT
     ( prod_id       INTEGER      
     , prod_code     VARCHAR(5)   
     , prod_name     VARCHAR(100)
     , unit_price    NUMERIC(6,2) NOT NULL
     , manufacture_date  DATE DEFAULT sysdate )
 PARTITION BY RANGE (manufacture_date)
 (PARTITION "P_20190501"  VALUES LESS THAN (TO_DATE(' 2019-05-02 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) 
  );

DATE_TRUNC

DATE_TRUNC函数返回日期,将日期的时间部分截断为格式模型fmt指定的单位。

输入

select trunc(to_char(trunc(add_months(sysdate,-12),'MM'),'YYYYMMDD')/100) into v_start_date_s from dual;
select trunc(to_char(trunc(sysdate,'mm'),'YYYYMMDD')/100) into v_end_date_e from dual;
ID_MNTH>=TRUNC(TO_CHAR(ADD_MONTHS(to_date(to_char('||v_curr_date||'),''YYYYMMDD''),-12),''YYYYMMDD'')/100))
AND ID_MNTH>=TRUNC(TO_CHAR(ADD_MONTHS(to_date(to_char('||v_curr_date||'),''YYYYMMDD''),-12),''YYYYMMDD'')/100))

select TRUNC(to_char(add_months(trunc(TO_DATE(TO_CHAR(P_DATE),'YYYYMMDD'),'MM')-1,-2),'YYYYMMDD')/100) INTO START_MONTH from dual; 
select TRUNC(TO_CHAR(trunc(TO_DATE(TO_CHAR(P_DATE),'YYYYMMDD'),'MM')-1,'YYYYMMDD')/100) INTO END_MONTH from dual;

输出

SELECT Trunc(To_char(Date_trunc ('MONTH', mig_ora_ext.Add_months (SYSDATE, -12)) , 'YYYYMMDD') / 100) 
INTO   v_start_date_s 
FROM   dual; 

SELECT Trunc(To_char(Date_trunc ('MONTH', SYSDATE), 'YYYYMMDD') / 100) 
INTO   v_end_date_e 
FROM   dual; 

SELECT Trunc(To_char(mig_ora_ext.Add_months (Date_trunc ('MONTH', To_date(To_char(p_date), 'YYYYMMDD' )) - 1 , -2), 'YYYYMMDD') / 100) 
INTO   start_month 
FROM   dual;

SELECT Trunc(To_char(Date_trunc ('MONTH', To_date(To_char(p_date), 'YYYYMMDD')) - 1, 'YYYYMMDD') / 100) 
INTO   end_month 
FROM   dual; 

LAST_DAY

Oracle的LAST_DAY函数根据date(日期)值返回该月份的最后一天。

LAST_DAY(date)

不论date的数据类型如何,返回类型始终为DATE。

LAST_DAY是Oracle的系统函数,GaussDB(DWS)不隐式支持该函数。要支持此函数,DSC会在MIG_ORA_EXT模式中创建一个LAST_DAY函数。迁移后的语句将使用此新函数MIG_ORA_EXT.LAST_DAY,如下示例。

在使用此函数之前,请执行如下操作:

  1. 创建并使用MIG_ORA_EXT模式。
  2. 复制custom scripts文件的内容,并在要执行迁移的所有目标数据库中执行此脚本。详情请参见迁移流程

输入:LAST_DAY

 SELECT
          to_date( '01/' || '07/' || to_char( sysdate ,'YYYY' ) ,'dd/mm/yyyy' ) FIRST
          ,last_day( to_date( '01/' || '07/' || to_char( sysdate ,'YYYY' ) ,'dd/mm/yyyy' ) ) last__day
   FROM
          dual;

输出

SELECT
          to_date( '01/' || '07/' || to_char( sysdate ,'YYYY' ) ,'dd/mm/yyyy' ) FIRST
          ,MIG_ORA_EXT.LAST_DAY (
               to_date( '01/' || '07/' || to_char( sysdate ,'YYYY' ) ,'dd/mm/yyyy' )
          ) last__day
  FROM
          dual;

MONTHS_BETWEEN

MONTHS_BETWEEN函数返回两个日期之间的月份数。

MONTHS_BETWEEN是Oracle系统函数,GaussDB(DWS)并不隐式支持该函数。要支持此函数,DSC需在MIG_ORA_EXT模式中创建一个MONTHS_BETWEEN函数。迁移后的语句将使用此新函数MIG_ORA_EXT.MONTHS_BETWEEN,如下所示。

在使用此函数之前,请执行如下操作:

  1. 创建并使用MIG_ORA_EXT模式。
  2. 拷贝custom scripts文件中的内容,并在要执行迁移的所有目标数据库中执行此脚本。详情请参见迁移流程

输入:MONTHS_BETWEEN

Select Months_Between(to_date('2017-06-20', 'YYYY-MM-DD'), to_date('2011-06-20', 'YYYY-MM-DD')) from dual;

输出

Select MIG_ORA_EXT.MONTHS_BETWEEN(to_date('2017-06-20', 'YYYY-MM-DD'), to_date('2011-06-20', 'YYYY-MM-DD')) from dual;

SYSTIMESTAMP

SYSTIMESTAMP函数返回数据库所在系统的系统日期,包括精确到小数的秒和时区。返回类型为TIMESTAMP WITH TIME ZONE。

图1 输入:SYSTIMESTAMP
图2 输出:SYSTIMESTAMP