获取oracle两个时间断的月份与天数

1.2017-01-05至2018-04-05 希望返回 每个月有几天,可以用一个函数或者存储过程来实现

2.因为有大量的数据需要处理,所以返回值需要有对应,也就是说输入(id,起始日期,结束日期) 就可以返回对应的id 每个月的天数: id 月份 天数

0

5个回答

函数设计思路

 --计算相差月份
循环{
            --赋值当前日期(累加)
            --计算当前年是否闰年
            --追加当前年月和天数
            --当前日期加1
}

函数内容

 create or replace function GETMONTHANDDAYS(ID VARCHAR2,DATE_START in DATE, DATE_END in DATE) return varchar2 is
  FunctionResult varchar2(2000) := '';
  type num_list is varray(12) of VARCHAR2(2);
  P_DAYS num_list := num_list('31','30','31','30','31','30','31','31','30','31','30','31');
  P_DAYS_RUNNIAN num_list := num_list('31','29','31','30','31','30','31','31','30','31','30','31');
  CUR_DATE DATE;
  CUR_YEAR NUMBER;
  CUR_MONTH NUMBER;
  GE_MONTH NUMBER;

begin
  select ceil(months_between(DATE_END,DATE_START)) INTO GE_MONTH FROM DUAL;
  CUR_DATE := DATE_START;
  if GE_MONTH>0 then
    LOOP
      EXIT WHEN GE_MONTH=0;
      select extract(year from CUR_DATE) into CUR_YEAR FROM DUAL;
      SELECT EXTRACT(MONTH FROM CUR_DATE) INTO CUR_MONTH FROM DUAL;
      IF ((mod(CUR_YEAR, 4)=0 and mod(CUR_YEAR, 100)!= 0) or  (mod(CUR_YEAR, 400) = 0)) then
        FunctionResult := (FunctionResult||';'||ID||','||to_char(CUR_DATE,'yyyymm')||','||P_DAYS_RUNNIAN(CUR_MONTH));
      ELSE 
        FunctionResult := (FunctionResult||';'||ID||','||to_char(CUR_DATE,'yyyymm')||','||P_DAYS(CUR_MONTH));
      END IF;
      CUR_DATE:= ADD_MONTHS(CUR_DATE,1);
      GE_MONTH := GE_MONTH - 1;
    END LOOP;
  end if;
  return(substr(FunctionResult,2));
end GETMONTHANDDAYS;

结果示例(只需要根据分号截取每一条看是不是你想要的)
图片说明

1
u012404960
jamsbwo 换插入表的话,这里就不累加了直接insert into table(id,month,days)(id,to_char(CUR_DATE,'yyyymm'),P_DAYS_RUNNIAN(CUR_MONTH))
大约一年之前 回复
u012404960
jamsbwo 回复qq_15361999: FunctionResult := (FunctionResult||';'||ID||','||to_char(CUR_DATE,'yyyymm')||','||P_DAYS_RUNNIAN(CUR_MONTH));
大约一年之前 回复
qq_15361999
qq_15361999 可以让显示按行来显示吗?或者插入一个表中有三列,id 月份 天数?
大约一年之前 回复

select trunc(时间1- 时间2) from table_name;

1

可以让显示按行来显示吗?或者插入一个表中有三列,id 月份 天数?

0

我才发现,不对啊 2017-01-05至2018-04-05 这个日期得2017-01天数应该是27 2018-04 的颖是5天,怎么出来都是31和30天???

0
u012404960
jamsbwo 哦,你是只计算当月剩余的是吗,我改下
大约一年之前 回复

IF ((mod(CUR_YEAR, 4)=0 and mod(CUR_YEAR, 100)!= 0) or (mod(CUR_YEAR, 400) = 0)) then
IF (EXTRACT(month FROM CUR_DATE)==EXTRACT(month FROM DATE_START)) then
FunctionResult := (FunctionResult||';'||ID||','||to_char(CUR_DATE,'yyyymm')||','||(P_DAYS_RUNNIAN(CUR_MONTH)-EXTRACT(day FROM DATE_START));
ELSE
FunctionResult := (FunctionResult||';'||ID||','||to_char(CUR_DATE,'yyyymm')||','||P_DAYS_RUNNIAN(CUR_MONTH));
END IF
ELSE

IF (EXTRACT(month FROM CUR_DATE)==EXTRACT(month FROM DATE_END)) then
FunctionResult := (FunctionResult||';'||ID||','||to_char(CUR_DATE,'yyyymm')||','||EXTRACT(day FROM DATE_END));
ELSE
FunctionResult := (FunctionResult||';'||ID||','||to_char(CUR_DATE,'yyyymm')||','||P_DAYS(CUR_MONTH));
END IF
END IF;
--中间那一段改成这个试试

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Oracle根据年份和月份,返回该月一共有多少天
select to_char(last_day(to_date(‘2017-02’,’yyyy-mm’)),’dd’) from dual 也可以通过编写一共函数,根据是否是平年或者是闰年得到,在这里充分用到了oracle自带的函数,通过获取该日期的最后一天,只取年月日的日部分数据,技巧嘿嘿!
oracle 根据一个时间段获取这个时间段内所有月份
@TOC oracle 根据一个时间段获取这个时间段内所有月份 获取月份列表: SELECT TO_CHAR(ADD_MONTHS(TO_DATE(‘2014-10’, ‘yyyy-MM’), ROWNUM - 1), ‘yyyyMM’) as monthlist FROM DUAL CONNECT BY ROWNUM <= months_between(to_date(‘2015-06’,...
已知某年某月获取月最大天数
import java.util.Calendar; import java.util.GregorianCalendar; //已知一个某年某月获取其天数 public class test17 { public static void main(String[] args) {  System.out.println(getMonthDay1(2018, 2)); }
日期之间相差的天数,月份差,日期月份加一个月 ,取得当月第一天 和最后一天日期,两个不同月之间的总天数,当月总天数
一. 获取当月总天数 public class Test5 { public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); java.util.Date d = sdf.parse("2017-2-04
两个日期相差的天数,月份,年份
import java.time.LocalDate; import java.time.Period; import java.time.format.DateTimeFormatter; public class Days { public static void main(String[] args) { String d1="2018-02-07"; String d2="...
Oracle获取两个日期之间的所有日期(年-月)
前言:在外漂泊,还是身体为重,健康是第一,因为自己扁桃体反复化脓,做了手术,目前感觉恢复的差不多了,继续学习和分享。 今天分享的是,使用oracle来查询两个日期之间的所有日期,此处指的日期格式是YYYY-MM的形式。 SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2018-01', 'YYYY-MM'), ROWNUM - 1),'YYYY-MM') DAY_ID...
python简单获取两个日期之间的年度、月度、天数差的方法
    最近因为要做一些简单的结算工作,里面有一些规则需要对年度、月份、天数进行比较,在网上查了半天,忽然发现python进行年度、月份、日期处理这么难?!居然只是要计算两个时间之间的月份差,还要数十行代码!     有点不敢相信,所以自己写了一个日期和月份差的函数,现推荐给大家(通过datetime包实现):import datetimedef days(str1,str2):    date1...
oracle 常用写法--查找当月天数
select to_char(last_day(TO_DATE('2018-01-02','YYYY-MM-DD')),'dd') from dual
oracle两个时间相减,得到精确的天数(不四舍五入)去比较
 update apex_主订单 a      SET a.flag = '已取消'     where      a.ordertype='WX'     and a.flag = '待调度'     and round((to_char(sysdate - a.ordertime)))>2;
Java 计算时间间隔
public static void main(String[] args) throws ParseException { long d1,d2,d3; ArrayList<String> list = new ArrayList(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd...
Java统计两个日期时间段每个月对应的天数
现在有这样一个需求: 统计两个日期时间段每个月对应的天数 比如:2017-03-12 ~ 2018-12-18 2017-03-12到该月月底共有多少天 2017-04-01到该月月底有多少天 。。。 代码实现: public class TimeUtils { public static void main(String[] args) throws Exce
Java 获取两个时间之间的月、天、天数
1、 获取两个时间之间的月, 时间格式 yyyy-MM  或者yyyy-MM-dd  2、获取两个时间之间的天,时间格式 yyyy-MM-dd 3、获取月的天 4、获取两个时间之间的天数,时间格式 yyyy-MM-dd import java.text.ParseException; import java.text.SimpleDateFormat; import java.util....
Oracle获取当前月区间
问题描述:输入一个时间,获得当前月区间。如:输入2018/09/03 获得2018/09/01至2018/09/30 SELECT * FROM servicerecord a WHERE a.servicetime >= trunc(sysdate,'MONTH') AND a.servicetime <= (last_day(trunc(sysdate,'MONTH'))+1...
Oracle查询两日期间隔的年月日
Oracle 两日期间隔的年月日用365 或者30天 都是不准的 months_between(date1,date2)函数得到的是两个时间间隔的日历月 是准确的
oracle和sqlserver中获取起始时间在某一个季度或者月份所占的天数的函数
Oracle》》》》》》》》》》》》》》》》》》》》》》》》获取起始时间在某一个季度所占的天数 /* * FUNCTION NAME:get_curq_hold_day * param: * p_start_date 开始日期 * p_end_date 结束日期 * p_year 年份 格式:Y2018 * p_quarter 季度 格式:...
PostgreSQL获取天数
select producename ||'注册证即将到期' as message,extract(DAY from (failuredate-NOW() )) from producetable
oracle数据库如何获取两个时间点之前相差具体年月日问题
以XE数据库中的employees表为例 获得所有员工入职的具体时间的年月日select first_name||' '||last_name as 姓名, to_char(sysdate,'YYYY/MM/DD') 当前时间, hire_date 入职时间, (trunc(trunc(months_between(sysdate,hire_date))/12))||'年'|| (trunc(m
计算两个日期相差的月份+天数
例如2018-04-05和2018-10-14,相差6月9天; 下面直接上代码 /** * 计算连个日期相差多少月+天 * @param stDate * @param endDate * @return */ public static String getDayAndMonth(String stDate, String endDat...
golang 获取指定年份中的所有天数
用途获取指定年份/月份中的所有天数package mainimport ( "fmt" "time" )func main() { days := make([]string, 0) year := time.Now().Year() for month := 1; month <= 12; month++ { for day := 1; day
oracle时间月份获取
取月份 1:to_char(to_date('2019/03','yyyy/MM'),'MM') 2.: SELECT EXTRACT(MONTH FROM TO_DATE(V_EDATE, 'YYYY/mm')) INTO V_MONTH FROM DUAL;
Oracle查询2个日期所跨过的月份列表/日期列表
1.基本逻辑公式: Select Rownum, 开始日期+Rownum-1 from dual connect by rownum&amp;lt; 结束日期-开始日期 +2;   2.查询2个日期所跨过的日期yyyy-mm-dd列表: 查询结果: SQL代码(开始时间:2019-01-22,结束时间:2019-01-02): Select Rownum, to_date('2019-...
Spark SQL日期相距天数,月数
dateDF.withColumn(&quot;week_ago&quot;,date_sub(col(&quot;today&quot;),7)) .select(datediff(col(&quot;week_ago&quot;),col(&quot;today&quot;))).show(1) dateDF.select(to_date(lit(&quot;2016-01-01&quot;)).as(&quot;start&quot;), to_date(li
ORACLE获取某个时间段之间的月份列表
ORACLE获取某个时间段之间的月份列表 获取某个时间段之间的月份列表(示例返回2009-03到2010-03之间的月份列表) SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2009-03','YYYY-MM'),ROWNUM-1 ),'YYYY-MM') DAY_ID FROM DUAL CONNECT BY ROWNUM...
获取两个日期之间的月份数与天数
/** * 返回一个二维数组,单位分别是月和日,代表两个Date之差。 &amp;lt;br&amp;gt; * 本方法忽略小时和分钟。 &amp;lt;br&amp;gt; * &amp;lt;br&amp;gt; * 例: &amp;lt;br&amp;gt; * 1,2012年6月1日到2012年6月3日,返回值是[0,2] (2天) &amp;lt;br&amp;gt; * 2,2012年6月1...
js获取指定月份的天数-1月31日时出现问题的解决方法
今天写代码的时候发现在当前时间是2019年1月31日时,获取指定月份天数时采用:let date =new Date(); date.setFullYear(2019); date.setMonth(1); date.setDate(0);用date.getDate()获取的天数是28。研究发现,发现date.setMonth(1)时,当前的天数是31,设置成2月,则日期自动变成3月的前几号,再s...
Oracle 查询两个日期之间的所有月份
Oracle 查询两个日期之间的所有月份
获取指定月份的工作日天数
package com.gary.util; import java.util.Calendar; /** * 日期工具 * @author gary * */ public class DateUtil { /** * 计算两个日期的相隔天数 * @param d1 * @param d2 * @return */ public s...
根据年份和月份获得天数
该方法已经不记得出处地址了,但是确实是一个好方法。 [code=&quot;java&quot;] /** * 根据传入的年份和月份获得该月份的天数 * * @param year * 年份-正整数 * @param month * 月份-正整数 * @return 返回天数 */ public int get...
ios 计算月数、周数、天数
通常计算天数的的:NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; [gregorian setFirstWeekday:2]; NSDateFormatter *dateFormatter = [
Oracle相隔天数日期相减计算
select ROUND(TO_NUMBER(sysdate - to_date('2016-07-07','yyyy-mm-dd'))) from dual 项目中如果是date类型则不用转换日期 这样可以计算相隔天数
JS - 日期 - 获取某月的最大天数
函数 new Date(y, m, 0).getDate(); 天 的值是0,js会返回上一个月的最后一天,即最大天数。 示例 new Date(2019, 6, 0).getDate(); // 30
Oracle 从一个时间段(两个字段)中提取实际天数
需求: 表中有一个用户上线时间 和 用户下线时间(用户可能连续好几天不退出,也可能用户一天登录多次) ,与此根据这两个时间来统计用户实际在线天数 表结构:   create table sys_user_login_log ( id varchar2(36) primary key , create_by varchar2(36) , login_date date , exit...
计算两个日期相差的天数、月份
package com.example.datetestdemo;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; /** * @Description: 计算日期间相差天数、月份(相差的天数用1年2个月零3天格式展示)工具类 * @Author
oracle connect by及函数及生成等间隔的时间序列的方法
一、connect by 及相关函数的使用 ------------------------------------------- --路径关系 sys_connect_by_path(parentunit_id, ', ') --connect_by_isleaf:叶子 --connect_by_root:根节点 --level:梯队,层级 ---------------------
java实现获取月份的天数
/** * &amp;lt;p&amp;gt;Description: 获取月份的天数&amp;lt;/p&amp;gt; * @param date 月份 * @return List&amp;lt;String&amp;gt; * @author wangjs * @date 2018年7月4日下午2:56:41 */ public List&amp;lt;String&amp;gt; getMonthDays(String d...
mysql获得两个日期之间的时间差(年、月、天、时、分、秒)
  SELECT TIME_TO_SEC(TIMEDIFF('2018-09-30 19:38:45', '2018-08-23 10:13:01')) AS DIFF_SECOND1, -- 秒 UNIX_TIMESTAMP('2018-09-30 19:38:45')-UNIX_TIMESTAMP('2018-08-23 10:13:01') AS DIFF_SECOND2, -- 秒 ...
获取两个时间之间的月份
// 获取两个时间之间的月份 getMonthBetween (start, end) { var result = [start]; var starts = start.split('-'); var ends = end.split('-'); var staYear = parseInt(starts[0]); var ...
JavaScript 获取月份的总天数
1、JavaScript Date 对象 API: http://www.runoob.com/jsref/jsref-obj-date.html2、方法及描述 getMonth() : 从 Date 对象返回月份 (0 ~ 11)。 getDate() : 从 Date 对象返回一个月中的某一天 (1 ~ 31)。3、思路 将月份下移
mysql获取年份,月份,天数,的时间函数!
1、获取年份 select YEAR(CURDATE()); 2018 2、获取月份 select MONTH(CURDATE()); 12 3、获取日期 select DATE(CURDATE()); 14 4、获取当年一月份 select CONCAT(YEAR(CURDATE()),'-','01'); 2018-01 总结: 其实前3个函数的用法就是MONTH(时间...
js 获取当前月份的天数
var d = new Date(2017,2,0); console.log(d.getDate()); 初始化d为三月份的第0天,由于JavaScript中day的范围为1~31中的值,所以当设为0时,会向前 一天,也即表示上个月的最后一天。 function getMonthDayTotal(year,month){ let nextMonth = month + 1; ...