[转] SQL日期函数dayadd/datediff/datepart
函数一: CREATE OR REPLACE FUNCTION dayadd(p_Component varchar2,
p_Number number,
p_Date date) RETURN DATE IS
/****************************************************************/
/* 该函数为日期计算函数主要是计算〕 */
/* 从当前日期开始经过多少日、季、月、年等后的日期。 */
/* 入参说明:p_Component 时间元件,如年月日季度等等 */
/* p_Number 加数, 注意:应该为整数(可正可负) */
/* p_Date 基准时间 */
/* 注意:其他日期元件,如世纪等等,暂时未考虑 */
/***************************************************************/ v_Component varchar2(10);
v_MiddleNumber number;
v_ReturnValue_Str varchar2(20); --字符串日期格式
v_ReturnValue date; --返回日期 BEGIN
v_Component := upper(ltrim(rtrim(p_Component)));
if v_Component in ('Y', 'YY', 'YEAR', 'YYYY') then
--年情况
v_ReturnValue := add_months(p_Date, p_Number * 12);
elsif v_Component in ('M', 'MM', 'MONTH', 'MON') then
--月情况
v_ReturnValue := add_months(p_Date, p_Number);
elsif v_Component in ('D', 'DD', 'DAY') then
--日情况
v_ReturnValue := p_Date + p_Number;
elsif v_Component in ('H', 'HH', 'HOUR') then
--时情况
v_ReturnValue := p_Date + p_Number / 24;
elsif v_Component in ('MI', 'MINUTE') then
--分情况
v_ReturnValue := p_Date + p_Number / 1440;
elsif v_Component in ('S', 'SS', 'SECOND') then
--秒情况
v_ReturnValue := p_Date + p_Number / 86400;
elsif v_Component in ('Q', 'QQ', 'QUARTER') then
--季度情况
v_ReturnValue := p_Date + p_Number * 3;
elsif v_Component in ('W', 'WW', 'WK', 'WEEK') then
--周情况
v_ReturnValue := p_Date + p_Number * 7;
else
v_ReturnValue := to_date('1-1-1', 'yyyy-mm-dd');
end if;
RETURN v_ReturnValue;
EXCEPTION
WHEN OTHERS THEN
RETURN to_date('1-1-1', 'yyyy-mm-dd'); --例外处理 END; 函数二: create or replace function datediff(p_Component varchar2,
p_Subtranhend date,
p_Minuend date) RETURN NUMBER IS
/*************************************************************************/
/* 功 能:返回两个日期之间的天、周、月、年等数量。 */
/* 入参说明: p_Component 时间元件,如年月日季度等等 */
/* p_Subtrahend 减数时间 */
/* p_Minuend 被减数时间 */
/*************************************************************************/ v_ReturnValue number; -- 结果数值
v_Component varchar2(10); --日期组件中间转换形式,截取空格并且转为大写
v_YearNum1 number; --减数年份数
v_YearNum2 number; --被减数年份数
v_MonthNum1 number; --减数月份数
v_MonthNum2 number; --被减数月份数
v_HourNum1 number; --减数时数
v_HourNum2 number; --被减数时数
v_MinuteNum1 number; --减数分钟数
v_MinuteNum2 number; --被减数分钟数
v_SecondNum1 number; --减数秒钟数
v_SecondNum2 number; --减数秒钟数
v_QuarterValue1 number; --减数季度数
v_QuarterValue2 number; --被减数季度数
v_WeekNum1 number; --减数与标准时间周差
v_WeekNum2 number; --被减数与标准时间周差
BEGIN
v_Component := upper(ltrim(rtrim(p_Component)));
if v_Component in ('Y', 'YY', 'YEAR', 'YYYY') then
--年情况
v_YearNum1 := to_number(to_char(p_Subtranhend, 'YYYY'));
v_YearNum2 := to_number(to_char(p_Minuend, 'YYYY'));
v_ReturnValue := v_YearNum2 - v_YearNum1;
elsif v_Component in ('M', 'MM', 'MONTH', 'MON') then
--月情况
--请注意,这个部分与Oracle内置日期函数MONTH_BETWEEN()不同,忽略了日因素
--而后者的两个日期如都是所在月的最后一天,才返回整数,否则,返回分数
--而且这个分数是以31天作为一个月进行计算的结果
v_YearNum1 := to_number(to_char(p_Subtranhend, 'YYYY'));
v_YearNum2 := to_number(to_char(p_Minuend, 'YYYY'));
v_MonthNum1 := to_number(to_char(p_Subtranhend, 'MM'));
v_MonthNum2 := to_number(to_char(p_Minuend, 'MM'));
v_ReturnValue := (v_YearNum2 - v_YearNum1) * 12 +
(v_MonthNum2 - v_MonthNum1);
elsif v_Component in ('D', 'DD', 'DAY') then
--日情况
--这里与两个日期直接相减的oracle日期算术也不同,只返回整数天数;
--而后者可以返回一天的几分之几(以小数形式表达)
v_ReturnValue := to_date(to_char(p_Minuend, 'yyyy-mm-dd'), 'YYYY-MM-DD') -
to_date(to_char(p_Subtranhend, 'yyyy-mm-dd'),
'YYYY-MM-DD');
elsif v_Component in ('H', 'HH', 'HOUR') then
--时情况
--第一步:求出天数
v_ReturnValue := (to_date(to_char(p_Minuend, 'yyyy-mm-dd'),
'YYYY-MM-DD') -
to_date(to_char(p_Subtranhend, 'yyyy-mm-dd'),
'YYYY-MM-DD'));
--第二步:求出时数
v_HourNum1 := to_number(to_char(p_Subtranhend, 'HH24'));
v_HourNum2 := to_number(to_char(p_Minuend, 'HH24'));
v_ReturnValue := v_ReturnValue * 24 + (v_HourNum2 - v_HourNum1);
elsif v_Component in ('MI', 'MINUTE') then
--分情况
--第一步:求出天数
v_ReturnValue := (to_date(to_char(p_Minuend, 'yyyy-mm-dd'),
'YYYY-MM-DD') -
to_date(to_char(p_Subtranhend, 'yyyy-mm-dd'),
'YYYY-MM-DD'));
--第二步:求出时数
v_HourNum1 := to_number(to_char(p_Subtranhend, 'HH24'));
v_HourNum2 := to_number(to_char(p_Minuend, 'HH24'));
v_ReturnValue := v_ReturnValue * 24 + (v_HourNum2 - v_HourNum1);
--第三步:求出分钟数
v_MinuteNum1 := to_number(to_char(p_Subtranhend, 'MI'));
v_MinuteNum2 := to_number(to_char(p_Minuend, 'MI'));
v_ReturnValue := v_ReturnValue * 60 + (v_MinuteNum2 - v_MinuteNum1);
elsif v_Component in ('S', 'SS', 'SECOND') then
--秒情况
--第一步:求出天数
v_ReturnValue := (to_date(to_char(p_Minuend, 'yyyy-mm-dd'),
'YYYY-MM-DD') -
to_date(to_char(p_Subtranhend, 'yyyy-mm-dd'),
'YYYY-MM-DD'));
--第二步:求出时数
v_HourNum1 := to_number(to_char(p_Subtranhend, 'HH24'));
v_HourNum2 := to_number(to_char(p_Minuend, 'HH24'));
v_ReturnValue := v_ReturnValue * 24 + (v_HourNum2 - v_HourNum1);
--第三步:求出分钟数
v_MinuteNum1 := to_number(to_char(p_Subtranhend, 'MI'));
v_MinuteNum2 := to_number(to_char(p_Minuend, 'MI'));
v_ReturnValue := v_ReturnValue * 60 + (v_MinuteNum2 - v_MinuteNum1);
--第四步:求出秒钟数
v_SecondNum1 := to_number(to_char(p_Subtranhend, 'SS'));
v_SecondNum2 := to_number(to_char(p_Minuend, 'SS'));
v_ReturnValue := v_ReturnValue * 60 + (v_SecondNum2 - v_SecondNum1);
elsif v_Component in ('Q', 'QQ', 'QUARTER') then
--季度情况
v_YearNum1 := to_number(to_char(p_Subtranhend, 'YYYY'));
v_YearNum2 := to_number(to_char(p_Minuend, 'YYYY'));
v_QuarterValue1 := to_number(to_char(p_Subtranhend, 'Q'));
v_QuarterValue2 := to_number(to_char(p_Minuend, 'Q'));
v_ReturnValue := (v_YearNum2 - v_YearNum1) * 4 +
(v_QuarterValue2 - v_QuarterValue1);
elsif v_Component in ('W', 'WW', 'WK', 'WEEK') then
--周情况
--一周的起始日期应当为星期日
--关于周差的计算,尝试采用中间日期的方法
--经查,‘1-1-2’即公元一年1月2日为周日,我们就可以用两个时间分别与其相减求周差
--两个结果再相减,即可得到正确的数值
v_WeekNum1 := floor((to_date(to_char(p_Subtranhend, 'YYYY-MM-DD'),
'YYYY-MM-DD') -
to_date('1-1-2', 'YYYY-MM-DD')) / 7);
v_WeekNum2 := floor((to_date(to_char(p_Minuend, 'YYYY-MM-DD'),
'YYYY-MM-DD') -
to_date('1-1-2', 'YYYY-MM-DD')) / 7);
v_ReturnValue := v_WeekNum2 - v_WeekNum1;
else
v_ReturnValue := -88888;
end if;
RETURN v_ReturnValue;
EXCEPTION
WHEN OTHERS THEN
RETURN - 99999; --例外处理
END datediff; 函数三: create or replace function datepart(p_Component varchar2, p_Date date)
RETURN NUMBER IS
/*************************************************************************/
/* 功 能:获取某个日期中的部分时间元件(日、月、年、分、秒、等) */
/* 入参说明: p_Component 时间元件,如年月日季度等等 */
/* p_Date 需要解析的时间 */
/*************************************************************************/
v_Component varchar2(10);
v_ReturnValue NUMBER;
BEGIN
v_Component := upper(ltrim(rtrim(p_Component)));
if v_Component in ('Y', 'YY', 'YEAR', 'YYYY') then
--年情况
v_ReturnValue := to_number(to_char(p_Date, 'YYYY'));
elsif v_Component in ('M', 'MM', 'MONTH', 'MON') then
--月情况
v_ReturnValue := to_number(to_char(p_Date, 'MM'));
elsif v_Component in ('D', 'DD', 'DAY') then
--日情况
v_ReturnValue := to_number(to_char(p_Date, 'DD'));
elsif v_Component in ('H', 'HH', 'HOUR', 'HH24') then
--时情况
v_ReturnValue := to_number(to_char(p_Date, 'HH24'));
elsif v_Component in ('MI', 'MINUTE') then
--分情况
v_ReturnValue := to_number(to_char(p_Date, 'MI'));
elsif v_Component in ('S', 'SS', 'SECOND') then
--秒情况
v_ReturnValue := to_number(to_char(p_Date, 'SS'));
elsif v_Component in ('Q', 'QQ', 'QUARTER') then
--季度情况
v_ReturnValue := to_number(to_char(p_Date, 'Q'));
elsif v_Component in ('W', 'WW', 'WK', 'WEEK') then
--周几情况(周日为第一天)
v_ReturnValue := to_number(to_char(p_Date, 'D'));
elsif v_Component in ('WEEK_NO') then
-- 第几周情况
v_ReturnValue := to_number(to_char(p_Date, 'IW'));
else
v_ReturnValue := -88888;
end if; RETURN v_ReturnValue;
EXCEPTION
WHEN OTHERS THEN
RETURN - 99999; --例外处理 END datepart;
[转] SQL日期函数dayadd/datediff/datepart的更多相关文章
- sqlserver日期函数 dateadd,datediff ,datepart ,datename,convert
reference:http://www.cnblogs.com/coconut_zhang/archive/2009/02/02/1382598.html http://blog.itpub.net ...
- DB2 SQL 日期函数
DB2 SQL 日期函数1:CURRENT TIMESTAMP 函数:获取当前日期时间语法:CURRENT TIMESTAMP参数:当前日期时间返回值:当前日期时间 2:CURRENT DATE 函数 ...
- 四个很好用的Sql Server 日期函数:DateDiff、DatePart、DateAdd、DateName
我以前查一段时间范围内的数据都是在程序里计算好日期再掉查询语句,现在我用下面的函数.SQL SERVER没有查一季度数据的函数. DateDiff函数: 描述 返回两个日期之间的时间间隔. 语法 Da ...
- sql日期函数操作
sql语句获取本周.本月.本年数据 SQL Serverselect * from [data] where DATEPART(m,[date])=2 Accessselect * from [da ...
- sql日期函数
1.sql常用日期函数 当我们在进行数据处理的时候,常常需要用到日期函数的计算,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配.只要数据包含的只是日期部分,运行查询就不会出问题. ...
- sql日期函数总结
sql 时间转换格式 convert(varchar(10),字段名,转换格式) convert(varchar(10),字段名,转换格式) CONVERT(nvarchar(10),count_ ...
- SQL 日期函数转换
1.转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用将字符类型按一定格式转化为日期类型: 具体用法:to_date('2004-11 ...
- Sql server日期函数用法
SQL日期函数 SQL日期函数中的类型码可以为0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 ,20,21,22,23,24,25,100,101,102,103,104,105 ...
- SQL日期查询语句
--查询当天(1: select * from ShopOrder where datediff(day,ordTime,getdate()-1)=0 --查询当天(2:select * from i ...
随机推荐
- iozone的三大神器之一fileop
iozone用了很久,查看源码,发现iozone其实还附带两个工具fileop和pit_server,fileop测试了POSIX常用的函数,pit_server用来测试TCP或UDP服务 今天用了一 ...
- XSS理解与防御
一.说明 我说我不理解为什么别人做得出来我做不出来,比如这里要说的XSS我觉得很多人就不了解其定义和原理的,在不了解定义和原理的背景下他们可以拿站,这让人怎么理解呢.那时我最怕两个问题,第一个是题目做 ...
- const static extern
http://wenku.baidu.com/link?url=saMJ3WpR_Lili2oflaIK-xK7wkQhtP2I-FdEX6I_XjmNxl7m0Z8SYHJtfqyXYkSmok8h ...
- CAD小小调整,复制生成二层5.28
1.栏杆剖切索引:“符号标注”“索引符号",填写文字,标注效果: 2,台阶剖切索引:填写文字,标注效果: 3.符号标注:图名标注: 4一层平面图完成.复制生成二层平面,把图名改为”二层平面图 ...
- PDF 补丁丁 0.6.0.3282 版发布(修复内存漏洞)
补丁丁的新测试版修复了旧版在导出图片.分析文件结构时的内存漏洞. 对于希望表达对本软件感情的用户,可点击“帮助”菜单的“关于本程序及作者”命令,用微信扫描里面的二维码表达您的谢意. 新的测试版正在制作 ...
- excel中如何把文本转换为数字
今天被一个小问题难住了,本人用自己开发的成绩分析软件统计学校成绩,数据由excel导入,给我的数据全部是文本型,其实也不难,主要是我的软件是早期开发的,没有考虑这个问题,结果这个问题被美女老师解决了 ...
- 安装Ruby、Sass在WebStrom配置Scss编译环境css自动压缩
安装Sass和Compass sass基于Ruby语言开发而成,因此安装sass前需要安装Ruby.(注:mac下自带Ruby无需在安装Ruby!) window下安装SASS首先需要安装Ruby,先 ...
- GeoServer java.io.IOException: No such resource: generic.sld No such resource: generic.sld
原因是 发布 图层时 没有设置类型 默认 generic 但是我们的数据库中 没有这个 解决办法: 点击 图层--点击 相应的 图层名称 ---发布 --- WMS Settings 下面的Defa ...
- Windows平台下不同版本SVN对比
(1)SVN服务端subversion与SVN客户端tortoiseSVN (2)subversion服务器程序在windows下共有5个下载版本,分别是:Collabnet , SlikSVN , ...
- mpvue 转小程序实践总结
介绍 Mpvue 是一个使用 Vue.js 开发小程序的前端框架. 基础介绍 框架基于 Vue.js 核心,修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序 ...