MONTHS_BETWEEN 函数

MONTHS_BETWEEN 函数接受两个 DATE 或 DATETIME 表达式参数,并返回一个带符号的 DECIMAL 值,该值量化这些参数之间的月数间隔,就好像 month 是时间的单位一样。

此函数需要两个参数,每一参数可为 DATE 表达式或 DATETIME 表达式。

返回的值为 DECIMAL 数据类型,表示两个参数之间的差异,表达为基于 31 天为单位的 DECIMAL 值。如果第一个参数是晚于第二个参数的时间点,则返回的值的符号为正。如果第一个参数早于第二个参数,则返回的值的符号为负。如果两个参数相等,则返回值为零。

如果两个参数的日期都是一个月的同一天,或都是一个月的最后一天,则结果为整数。否则,基于一个月 31 天,来计算结果的小数部分。此小数部分还可包括 hourminutesecond 时间单位中的差异,除非两个参数都是 DATE 表达式。

下列查询使用通过 TO_DATE 表达式作为参数返回的两个 DATE 值,调用 Projection 子句中的 MONTHS_BETWEEN 函数。

SELECT MONTHS_BETWEEN(TO_DATE('2-2-2005', '%m-%d-%Y'),
        TO_DATE('1-1-2005',  '%m-%d-%Y')) 
        AS lunations FROM systables WHERE tabid = 1;
该查询返回的值表示两个 DATE 参数之间有 32 天的差异,作为 31 天月份的正值:
          months
          1.03225806451613
下一示例将 DATETIME 列表达式参数返回到 MONTHS_BETWEEN 表达式,以及对于表的两行,它们的以月计算的差异:
SELECT d_datetime, e_datetime, 
          MONTHS_BETWEEN(d_datetime, e_datetime) AS months_between
          FROM mytab1;
          
          
          d_datetime      2007-11-01 09:00:00.00000 
          e_datetime      2007-12-07 14:30:12.12345 
          months_between  -1.2009453405018
          
          
          d_datetime      2007-12-13 09:40:30.00000 
          e_datetime      2007-11-13 08:40:30.00000 
          months_between  1.00000000000000 
在此,第一个 MONTHS_BETWEEN 结果包括以小于天的时间单位计的差异。第二个结果没有小数部分,因为两个参数的 day 时间单位有相同的值。
下一示例中的 MONTHS_BETWEEN 表达式比较 DATE 与 DATETIME 值:
SELECT col_datetime, col_date,
          MONTHS_BETWEEN(col_datetime, col_date) AS months_between
          FROM mytab2;
          
          
          col_datetime    2008-12-13 08:40:30.00000 
          col_date        11/13/2007 
          months_between  13.0000000000000
由于两个参数指定该月的同一天,因此结果没有小数部分。