【请教高手】在plsql和oracle环境下,如何用sql语句实现计算“月数”???比如: 计算两个日期之间的“月数”:
200607---200708
20060701---20070831
而且这两个有何区别??? 2006-07---2007-08
2006-07-01---2007-08-31在plsql和oracle环境下,如何用sql语句实现计算“月数”???
解决方案 »
- 为什么直接sqlplus登录不了 nolog然后conn可以登录
- Oracle数据导入日期格式问题
- to_char时间转换问题,感觉有点怪
- oracle10g的OracleOraDb10g_home1iSQL*Plus服务启动不了
- 在线等待:关于oracle开发的程序安装后无法加载oci.dll的问题,急急急!!!
- 大侠们请过来看一下,sqlplus里面怎么执行?
- 请教:系统当前时间与表中时间字段如何进行比较?
- 如何批量运行插入语句???
- 请问我从oracle网站上下了一个oracle9,请问这需要注册码?谢谢了
- 数据库导出导入问题
- drop user XXX cascade;
- 50分咨询 数据库备份与恢复
var_begin_date in varchar2,
var_end_date in varchar2
)
return number
as
is_begin_date date;
is_end_date date;
is_count number(10);
i number(10);
j number(10);
is_this_date date;
begin
is_begin_date := to_date(var_begin_date,'yyyy-mm-dd');
is_end_date := to_date(var_end_date,'yyyy-mm-dd');
is_this_date := last_day(is_end_date) ;
is_count := 0 ; loop
exit when is_this_date < last_day(is_begin_date)+1 ;
is_count := is_count+1;
is_this_date := last_day(is_this_date)-32; end loop; return is_count;
end; /测试SQL>select fun_month_num('2004-09-30','2005-02-01') from dual; FUN_MONTH_NUM('2004-09-30','2005-02-01')
SQL> select months_between(to_date(200708,'yyyymm'),to_date(200607,'yyyymm')) from dual; MONTHS_BETWEEN(TO_DATE(200708,
------------------------------
13
SQL> select months_between(to_date(20070831,'yyyymmdd'),to_date(20060701,'yyyymmdd')) from dual;
MONTHS_BETWEEN(TO_DATE(2007083
------------------------------
13.9677419楼主看这个例子就明白了吧
这样可以吗???
SQL>select months_between(to_date(aae002,'yyyymm'),to_date(aae002,'yyyymm'))from dual;
200607---200708 之间应该是多少个月???? 13个月还是14个月?????? 20060701---20070831 之间应该是多少个月???? 13个月还是14个月??????
这个是你自己需求问题,你自己应该最清楚;二、
又如果: 日期都为“字段”aae002(日期型),又如何计算月数????
这样可以吗???
SQL>select months_between(to_date(aae002,'yyyymm'),to_date(aae002,'yyyymm'))from dual; 这么简单的东西为什么自己不进pl/sql试一下?
select to_number(to_char(to_date('200909','yyyymm'),'yyyy'))*12+to_number(to_char(to_date('200909','yyyymm'),'mm'))
- (to_number(to_char(to_date('200812','yyyymm'),'yyyy'))*12+to_number(to_char(to_date('200812','yyyymm'),'mm'))) from dual;
SELECT MONTHS_BETWEEN(TO_DATE('2006-05','yyyy-mm'),TO_DATE('2003-12','yyyy-mm')) FROM DUAL; --2:当输入日期精确到具体某一天时,月份出来带小数部分,此时要用ROUND函数取整
-- 当然:你也可以用TRUNC函数截断小数部分,这主要看你的业务规则了
SELECT ROUND(MONTHS_BETWEEN(TO_DATE('2006-05-01','yyyy-mm-dd'),TO_DATE('2003-12-16','yyyy-mm-dd'))) FROM DUAL;
SELECT ROUND(MONTHS_BETWEEN(TO_DATE('2006-05-01','yyyy-mm-dd'),TO_DATE('2003-12-16','yyyy-mm-dd'))) FROM DUAL;
-------------------------------
0
比如: 计算两个日期之间的“月数”:
200607---200708
20060701---20070831
而且这两个有何区别??? 2006-07---2007-08
2006-07-01---2007-08-31
200607---200708 结果和 2006-07---2007-08 一致。
20060701---20070831 结果和 2006-07-01---2007-08-31 一致由于上面的只到月份的,所以不会出现小数
下面是到日期的,所以计算的时候,是会出现小数的,当然也可能不出现小数,关键是看是不是相差是月份的整数比如你这里2006-07-01---2007-08-31 返回的就是小数
SQL> select months_between(to_date('20060701','yyyymmdd'), to_date('20070831', '
yyyymmdd')) result from dual; RESULT
----------
-13.967742如果是2006-07-01---2007-08-01就是正好整月了
SQL> select months_between(to_date('20060701','yyyymmdd'), to_date('20070801', '
yyyymmdd')) result from dual; RESULT
----------
-13这个问题是很基础的题了,你自己在sqlplus运行运行就知道结果了。