获取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))
12 个月之前 回复
u012404960
jamsbwo 回复qq_15361999: FunctionResult := (FunctionResult||';'||ID||','||to_char(CUR_DATE,'yyyymm')||','||P_DAYS_RUNNIAN(CUR_MONTH));
12 个月之前 回复
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 哦,你是只计算当月剩余的是吗,我改下
12 个月之前 回复

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 根据一个时间段获取这个时间段内所有月份、天数、日期
转自 : http://blog.csdn.net/jumtre/article/details/46345733 获取日期列表: [sql] view plain copy   SELECT TO_CHAR(TO_DATE('2014-10-01', 'yyyy-MM-dd') + ROWNUM - 1, 'yyyyMMdd')
Oracle 计算两个日期间隔的天数、月数和年数
转载自:https://www.cnblogs.com/AnneHan/p/4708386.html在Oracle中计算两个日期间隔的天数、月数和年数:一、天数:在Oracle中,两个日期直接相减,便可以得到天数;select to_date('08/06/2015','mm/dd/yyyy')-to_date('07/01/2015','mm/dd/yyyy') from dual;返回结果:36
oracle取当年天数与当月天数及指定月的天数
1.求当年天数的sql语句 SELECT ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 12) - TRUNC(SYSDATE, 'YYYY') days FROM DUAL 2.求当月天数的sql语句 SELECT to_number(to_char(last_day(trunc(SYSDATE)), 'DD')) from dua
oracle中某月天数的获取
select to_number(to_char(last_day(to_date(20070802,yyyymmdd)),dd))  from dual; 其中20070802为日期字符串,yyyymmdd为日期格式。
ORACLE根据日期获取当月的天数
CREATE OR REPLACE FUNCTION get_days (p_date DATE)    RETURN NUMBER AUTHID CURRENT_USER AS    p_days   NUMBER := 0; BEGIN    SELECT ( TO_DATE (TO_CHAR (ADD_MONTHS (p_date, 1), 'yyyymm'), 'yyyymm')
oracle中计算某月的天数
select add_months(to_date('201202', 'YYYYMM'),1)-to_date('201202', 'YYYYMM') from dual
比较两个日期大小和获取当前月最大天数的存储过程
下面简单介绍sqlserver2008两个常用的存储过程 1、比较两个日期大小的存储过程 2、获取当前月份的最大天数的存储过程 1、创建比较两个日期大小的存储过程 1)创建比较两个日期大小的存储过程 /*** ** 作用:比较两个日期的大小 **输入参数:第一个日期,第二个日期 **输出参数:返回结果 **/ create proc [dbo].[sp_CompareDate] (
Oracle根据年份和月份,返回该月一共有多少天
select to_char(last_day(to_date(‘2017-02’,’yyyy-mm’)),’dd’) from dual 也可以通过编写一共函数,根据是否是平年或者是闰年得到,在这里充分用到了oracle自带的函数,通过获取该日期的最后一天,只取年月日的日部分数据,技巧嘿嘿!
ORACLE获取某月的天数
 select to_number(to_char(last_day(to_date(2008-02-20,yyyy-mm-dd)),DD)) from dual 
PHP获取两个时间之间的年和月份及间隔天数 PHP两个日期之间的所有日期
[php] view plain copy  $time1 = strtotime('2014-02-04'); // 自动为00:00:00 时分秒 两个时间之间的年和月份   $time2 = strtotime('2015-02-06');       $monarr = array();   $monarr[] = '2014-02'; // 当前月;   wh
已知某年某月获取月最大天数
import java.util.Calendar; import java.util.GregorianCalendar; //已知一个某年某月获取其天数 public class test17 { public static void main(String[] args) {  System.out.println(getMonthDay1(2018, 2)); }
Oracle取两个日期之间的时间间隔
1、距当前日期XX天XX小时XX分XX秒之前 2、日期间隔 3、常用日期操作
Oracle 计算两个时间的差值
有两个日期数据START_DATE,END_DATE,欲得到这两个日期的时间差(以天,小时,分钟,秒,毫秒): 天: ROUND(TO_NUMBER(END_DATE - START_DATE)) 小时: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24) 分钟: ROUND(TO_NUMBER(END_DATE - START_DATE) * 2
ORACLE 取季度之间,时间区间查询,季度,月份,星期等时间信息
--本季度第一天 select to_char(trunc(sysdate, 'q'), 'yyyy-mm-dd') from dual; --上个季度最后一天(可以用本季度第一天减去1得到) select to_char(trunc(sysdate, 'q') - 1, 'yyyy-mm-dd') from dual; --上个季度第一天(本季度第一天 减 3个月) s
两个日期相差的天数,月份,年份
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="...
日期之间相差的天数,月份差,日期月份加一个月 ,取得当月第一天 和最后一天日期,两个不同月之间的总天数,当月总天数
一. 获取当月总天数 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
t-sql获取某月天数
此文主要向大家描述的是SQL Server日期函数之获得一个月中的实际天数的正确操作步骤,在实际草组中如果你想获得一个月的天数其主要操作技巧是:首先到得一个月最后一天的日期,然后通过 SQL Server 日期函数 day() 取得日期中的“天” 部分。 获得 2008 年 2 月份的天数: select day(cast('2008-03-01' as datetime) - 1
sql-获取指定年份指定月份的天数
declare @年月 varchar(6) set @年月= '201803' --查询2015年2月有多少天 select day(dateadd(month,1,@年月+ '01 ')-1)
PHP 如何获取两个时间之间的年和月份及间隔天数 PHP两个日期之间的所有日期
$time1 = strtotime('2014-02-04'); // 自动为00:00:00 时分秒 $time2 = strtotime('2015-02-06'); $monarr = array(); $monarr[] = '2014-02'; // 当前月; while( ($time1 = strtotime('+1 month', $time1)) <= $time2){
Oracle日期加减计算 方法汇总
无论是DATE还是timestamp都可以进行加减操作。 可以对当前日期加年、月、日、时、分、秒,操作不同的时间类型,有三种方法: 一、 使用内置函数numtodsinterval增加小时,分钟和秒 二、 加一个简单的数来增加天 三、 使用内置函数add_months来增加年和月 方法一例: 对当前日期增加一个小时: SQL> select sysdate, sy
Oracle获取两个日期之间的所有日期(年-月)
前言:在外漂泊,还是身体为重,健康是第一,因为自己扁桃体反复化脓,做了手术,目前感觉恢复的差不多了,继续学习和分享。 今天分享的是,使用oracle来查询两个日期之间的所有日期,此处指的日期格式是YYYY-MM的形式。 SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2018-01', 'YYYY-MM'), ROWNUM - 1),'YYYY-MM') DAY_ID...
根据月份运算天数
#include <stdio.h> #include <stdlib.h> #define MONTHS 12 int main() { int days[MONTHS]={31,28,31,30,31,30,31,31,39,31,30,31}; int month; do{ printf("Input a month:"); scanf(
Java统计两个日期时间段每个月对应的天数
现在有这样一个需求: 统计两个日期时间段每个月对应的天数 比如:2017-03-12 ~ 2018-12-18 2017-03-12到该月月底共有多少天 2017-04-01到该月月底有多少天 。。。 代码实现: public class TimeUtils { public static void main(String[] args) throws Exce
获取年份、月份、当月第几天、当月总天数
&amp;lt;script&amp;gt; //获取当月总共天数函数 function getMonDay(mydate) { var d = new Date(mydate); //d.getMonth()+1月份索引从0开始,天数索引从1开始,第0天即代表最后一天 var allDays = new Date(d.getFullYear(), (d.getMonth() + 1), 0).getDa...
oracle 显示俩个日期间所有的月份
最近在做系统的运营分析报表取数,涉及到按俩个年月之间所有月份的数据,首先需要把俩个年月所有的月份统计出来,经过一会的学习整理,利用oracle的递归可以 实现,请大拿指教,简单场景如下: SELECT DISTINCT TO_CHAR(T.ROWDATE, 'yyyy-mm') YYYYMM   FROM (SELECT ROWNUM, TO_DATE('2011-05', 'yyy
获取月份最大的天数
package com.dz.text;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.ut...
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
Oracle 获取两个时间间隔天数
select trunc(时间1- 时间2) from table_name; 时间1和时间2必须是date类型 如果不是必须to_date;
计算两个日期相差的月份+天数
例如2018-04-05和2018-10-14,相差6月9天; 下面直接上代码 /** * 计算连个日期相差多少月+天 * @param stDate * @param endDate * @return */ public static String getDayAndMonth(String stDate, String endDat...
计算两个日期相差的天数、月份
package com.example.datetestdemo;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; /** * @Description: 计算日期间相差天数、月份(相差的天数用1年2个月零3天格式展示)工具类 * @Author
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查询两日期间隔的年月日
Oracle 两日期间隔的年月日用365 或者30天 都是不准的 months_between(date1,date2)函数得到的是两个时间间隔的日历月 是准确的
SQLServer 获取当前月份的总天数 逐过程 一看就明白
--查询当前月份的天数--思路当前月份+1,就是下个月,然后用下个月的1号减一,就得到当前月份的最后一天,这样就知道当前月份有多少天了--用到的函数 getdate()当前的日期 dateadd() 在年月日中进行加减操作 year()日期中的年部分 month()日期中的月部分 datepart()取出日期中的某部分--第一步将当前期日的月部分加一select dateadd(mm,1,getd
oracle计算两个日期之间时间差值sql
sql Server中有函数DATEDIFF能够比较方便的计算出两个时间点之间的时间差值,但是oracle就没有,需要自己写方法计算,这是比较坑爹的。 自己写了个分享一下 create or replace function datediff(type in varchar2, startTime in varchar2,endTime in varchar2,v in varchar2) r
PostgreSQL获取天数
select producename ||'注册证即将到期' as message,extract(DAY from (failuredate-NOW() )) from producetable
获取指定(当前)月的天数。时间工具类 DateUtil
1、返回指定月份的总天数(当前年) eg:10--&amp;gt;31public static int countDaysInMonth(int month) {return LocalDate.now().withMonth(month).lengthOfMonth();}2、获取指定月份的当前日期的天数 eg:2017/10/10--&amp;gt;10 public static int countNow...
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
java 获取两个日期间相差的天数
package com.demo; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Demo05 { public static void main(String[] args) throws Exception { //设...
ORACLE获取某个时间段之间的月份列表
返回1-31,或者1-12,或者某个 select rownum from dual connect by rownum 就是connect by http://marcospring.iteye.com/blog/1721600 ORACLE获取某个时间段之间的月份列表  获取某个时间段之间的月份列表(示例返回2009-03到2010-03之间的月份列表
java实现输入任意两个日期输出月份数和天数
java实现输入任意两个日期输出月份数和天数,综合考虑闰年、2月等因素,对于整月计算利息或按天数计算利息提供基础工具类。也可以吧内部类独立出来,方便跨包调用,可自行调整。很实用的一个实现。其他百度查到的很多类似方法存在或多或少的缺陷。
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 学习java基础语法时 学习java时