Oracle中存在months_between、add_months函数,用作计算年龄等,例如计算某个人的年龄:岁(age)-月(monthss)-天(days)

SELECT rowid,a.fidate,a.fbirth,trunc(months_between(fidate, fbirth) / 12) age,trunc(mod(months_between(fidate, fbirth), 12)) monthss,trunc(fidate -add_months(fbirth, trunc(months_between(fidate, fbirth)))) daysfrom t_noentryquery a;

Oracle中调用,如下图:

为兼容Postgresql计算年龄等,以此来创建函数months_between

--入参为date类型
CREATE OR REPLACE FUNCTION months_between(date1 date, date2 date)
RETURNS "pg_catalog"."int4" AS $BODY$
DECLARE
v_res int;
begin
SELECT 12*EXTRACT(YEAR from age(date1,  date2))+EXTRACT(MONTH from age(date1, date2)) into v_res from dual;
RETURN v_res;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;--或者--入参为 timestamp without time zone类型
CREATE OR REPLACE FUNCTION months_between(date1 timestamp without time zone,date2 timestamp without time zone)RETURNS integerLANGUAGE 'plpgsql'COST 100VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
v_res int;
begin
SELECT 12*EXTRACT(YEAR from age(date1::date,  date2::date))+EXTRACT(MONTH from age(date1::date, date2::date)) into v_res from dual;
RETURN v_res;
end;
$BODY$;

为兼容Postgresql计算年龄等,以此来创建函数add_months

--入参为timestamp without time zone,numeric类型
create or replace function add_months(timestamp without time zone, numeric) returns timestamp as $$
declare  i interval := ($2 || 'month');  d1 date := date(to_timestamp($1::text,'yyyy-mm') + interval '1 month' - interval '1 day');  d2 date := date($1);  res timestamp;
begin  select case when d1=d2 then ((to_char($1+i+interval '1 month', 'yyyy-mm')||'-01')::date - 1) + $1::time else $1+i end into res;  return res;
end;
$$ language plpgsql strict; --或者--入参为timestamp,numeric类型
create or replace function add_months(timestamp, numeric) returns timestamp as $$
declare  i interval := ($2 || 'month');  d1 date := date(to_timestamp($1::text,'yyyy-mm') + interval '1 month' - interval '1 day');  d2 date := date($1);  res timestamp;
begin  select case when d1=d2 then ((to_char($1+i+interval '1 month', 'yyyy-mm')||'-01')::date - 1) + $1::time else $1+i end into res;  return res;
end;
$$ language plpgsql strict; 

Postgresql中调用:

SELECT a.fidate,a.fbirth,trunc(months_between(fidate, fbirth) / 12) age,trunc(mod(months_between(fidate, fbirth), 12)) monthss,trunc(fidate::date - add_months(fbirth,cast(trunc(months_between(fidate, fbirth)) as numeric))::date) daysfrom t_noentryquery a;

如下图:

当然也可以用Postgresql中自带的函数age(),更加方便快捷

select age(fidate ::date, fbirth ::date), a.fidate, a.fbirthfrom T_NOENTRYQUERY awhere a.fidate is not nulland a.fbirth is not null

如下图:

Postgresql中,计算两个日期月份差值或年月日,实现Oracle中months_between、add_months的效果相关推荐

  1. python计算两个日期天数差值

    从一个博主那里看的,自己思路改了一点,博主地址在下面 # 判断是否是闰年 def isLeapYear(year):if (year % 4 == 0 and year % 100 != 0) or ...

  2. mysql中日期怎样求差_在Sql语句中怎样计算出两个日期的差值

    展开全部 sql语句中计算两个日期的差值用32313133353236313431303231363533e4b893e5b19e31333365643662datediff函数. 工具:sqlser ...

  3. mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法

    mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法:  语法:  TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)  说明:  ...

  4. oracle中计算两个日期之间的差值

    2016年10月29日 阅读数:10503 最近几天在工作中用到了一项计算时间的功能,计算两个时间之间的天数差,顺道总结一下oracle中的语句:两个Date类型字段:START_DATE,END_D ...

  5. mysql中日期相减_非凡教育教你excel怎么计算两个日期天数差和时间差

    商务办公培训老师在本文中主要是介绍如何在excel中计算日期和时间,包括两个日期之间的天数.时间之间的差和显示样式. 首先,计算两个日期之间的天数.在excel中,两个日期直接相减就可以得到两个日期间 ...

  6. Java 8中计算两个日期间隔多少年、多少月、多少天 (Period)

    有一个常见日期操作计算两个日期之间的年数.月数.天数.在Java 8中可以用java.time.Period类来做计算. import java.time.LocalDate; import java ...

  7. Oracle中计算两个日期的相差天数、月数、年数、小时数、分钟数、秒数

    一.两个日期相差的小时.分钟.秒 1.1.实现效果 1.2.实现的sql语句 --Oracle中两个日期相差小时数-- select TO_NUMBER((TO_DATE('2021-09-22 11 ...

  8. java计算时间差_Java中计算两个日期的时间差

    这篇文章将使用两个例子计算两个日期的时间差. 1.使用Java SDK. 2.使用Joda库. 1.使用Java SDK 计算两个Date之间的时间差,基本思路为把Date转换为ms(微秒),然后计算 ...

  9. Java8 中计算两个日期间隔多少年、多少月、多少天的实现

    import org.apache.commons.lang.time.DurationFormatUtils; import java.util.Date;public class DateUtil ...

最新文章

  1. 《强化学习周刊》第2期:多智能体强化学习(MARL)赋能“AI智能时代”
  2. idea设置java_使用IntelliJ IDEA 配置JDK(入门)
  3. 【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )
  4. 深入浅出ShellExecute(总结)
  5. 如何查看自己的ubutu系统是32位的还是64位的
  6. [国家集训队]middle(二分+主席树[中位数思维题])
  7. codeforces1451 E. Bitwise Queries(位运算妙用)
  8. 人工智能AI实战100讲(七)-原理+代码实战 | 双目视觉中的极线校正
  9. React Native开发指南-在原生和React Native间通信
  10. Ionic 4.0.2 发布,移动应用开发框架
  11. redis 备份导出rdb_Redis持久化知识点—RDB+AOF ,你了解多少
  12. [转载]Oracle触发器用法实例详解
  13. 务必了解的跨境电商ERP独立部署!
  14. jenkins shell 权限_使用Jenkins一键打包部署SpringBoot应用,就是这么6!
  15. 记录:zlog交叉编译出aarch64的libzlog.a
  16. js获取ip地址、浏览器信息
  17. [黑苹果]简单修改FB实现显存增加至2048MB修复某些花屏
  18. 前端开发应知网站(强烈推荐!)
  19. 中国最具竞争力的十大调查研究咨询公司
  20. 神州优车拟41亿元收购宝沃汽车67%股权 1

热门文章

  1. 【评测】无血清细胞冻存液
  2. 拍卖商城系统源码下载 拍卖商城系统平台开发
  3. 计算机硬盘分区安全,如何安全、简便的对固态硬盘分区?
  4. C++ lower_bound() upper_bound() 函数用法详解(深入了解,一文学会)
  5. windows7经典开机音乐_糖豆人加入索尼克皮肤;三国群英传8上线Steam;疑似PS5开机音效...
  6. 移动SSD硬盘安装Ubuntu20.04LTS
  7. 【Qt编程】基于QWT的曲线绘制及图例显示操作
  8. html 各种字符 换位键,excel替换特定位置处的字符
  9. pandas操作excel文件,替换目标值
  10. dd_engi 的背包九讲