`
zgqynx
  • 浏览: 1370835 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

三个日期函数

阅读更多
三个日期函数(十分有用)!!!!!!!!
原文:http://www.itpub.net/139913.html
函数一:
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;
分享到:
评论

相关推荐

    Gbase 8s内置函数之日期函数

    SYSDATE、CURRENT和TODAY函数是Gbase 8s内置函数中的三个日期函数,它们的作用都是返回当前的日期和时间。不同的是,SYSDATE函数返回当前的日期和时间,包括时、分、秒和毫秒;CURRENT函数返回当前的日期和时间,但...

    sql日期函数大全

    `DATEDIFF`函数则用于计算两个日期之间的差异,同样接收三个参数:时间单位、起始日期和结束日期。该函数返回的是整数值,表示两个日期间的时间单位数量。例如,`DATEDIFF(dd, '2023-01-01', '2023-01-31')`返回30,...

    C# 常用日期时间函数

    以下是对C#中常用日期时间函数的详细解释: 1. **获取当前日期时间** ```csharp System.DateTime currentTime = System.DateTime.Now; ``` 这行代码创建了一个DateTime类型的变量`currentTime`,并将其设置为...

    Clickhouse 时间日期函数

    ClickHouse是一个开源的列式数据库管理系统,它提供了丰富的时间日期函数来处理和操作时间和日期数据。以下是ClickHouse中常用的时间日期函数的简介: 1. toDate(date_expression):将日期表达式转换为日期类型。...

    mysql 日期函数相关操作

    返回值分别为7、7和8,其中第三个参数为0时,一周从星期日开始;为1时,从星期一开始。 ### 10. `YEAR(date)` `YEAR()`函数返回指定日期是哪一年,范围从1000到9999。 示例: ```sql SELECT YEAR('98-02-03'); ``...

    编写一个友元函数,求两个日期之间相差的天数;

    在本题中,我们需要设计一个友元函数来计算两个日期之间的天数差异。下面将详细阐述如何实现这个功能。 首先,我们定义一个名为`Date`的类,它包含表示日期的年、月、日的数据成员。这些数据成员通常设置为私有,以...

    经常用到的javascript日期函数库啊

    为了简化这一过程,许多开发者选择利用自定义的日期函数库或者现有的第三方库来完成复杂的日期时间操作。本文将详细介绍一个实用的JavaScript日期函数库,包括其核心功能及使用方法。 #### 二、核心功能 根据提供...

    ORACLE常用日期函数集合

    ### ORACLE常用日期函数集合详解 #### 一、概述 在Oracle数据库中,日期处理是一项非常重要的功能。本文将详细介绍一些常用的Oracle日期函数及其应用场景,帮助数据库管理员或开发者更好地理解和运用这些函数,以...

    日期函数归类

    特别是在业务处理过程中,往往需要对日期进行各种各样的计算和转换,如获取当前时间、计算两个日期之间的差值等。本文将详细介绍一些常用的日期函数,并对其进行分类归纳,帮助读者更好地理解和运用这些函数。 ####...

    PowerBuilder常用日期时间函数

    **用法示例:** 使用 Month() 函数可以从一个日期值中提取出具体的月份。例如,从日期 "2023-07-01" 中提取月份,结果将是 7。 #### 六、Day(date) **功能:** 获取日期中的具体日子。 **参数:** date 类型的值。 ...

    在sql中常用的日期函数使用说明

    在SQL中,日期函数是处理和操作日期及时间的关键工具,它们帮助我们执行各种复杂的日期时间计算,如计算两个日期之间的差异、提取日期中的特定部分等。本文将深入解析SQL中常用的日期函数之一:`DatePart`函数及其...

    oracle日期函数全面总结

    例如,将当前日期往后推三个月: ```sql SELECT ADD_MONTHS(SYSDATE, 3) FROM DUAL; ``` 3. **MONTHS_BETWEEN(date1, date2)**: 计算两个日期之间的月份数,考虑到了日历中的天数差异。返回值可能为浮点数,表示...

    oracle各种日期函数

    除了以上介绍的功能外,Oracle还提供了许多其他的日期函数,比如用于计算两个日期之间间隔的 `MONTHS_BETWEEN` 函数,以及用于增加或减少指定日期单位的 `ADD_MONTHS` 和 `LAST_DAY` 等函数。这些函数在处理复杂的...

    sql 日期函数

    **DateDiff**函数用于计算两个日期之间的时间差,可以按天(dd)、周(wk)或月(mm)等单位进行计算。例如: 1. **查询某一天的数据**: - `SELECT * FROM TableName WHERE DateDiff(dd, DateTimCol, GetDate()) = 1;` ...

    sybase日期函数全解析

    在Sybase数据库系统中,日期和时间的处理是数据库操作中的常见任务,这涉及到一系列的日期函数。本文将深入解析Sybase的四个主要日期函数及其应用。 1. **getdate()** 函数: - `getdate()` 用于获取当前系统时间...

    DB2 基础日期函数.doc

    可以使用`current date`、`current time`以及`current timestamp`这三个DB2寄存器来获取系统的当前日期、时间以及精确到微秒的时间戳。这些寄存器可以通过`SELECT`语句从`sysibm.sysdummy1`表中查询,或者使用`...

    nextdate函数可以输出下一天日期

    利用这个函数,可以输入当天日期,然后输出先一天的日期。

    sqlserver日期函数.pdf

    这是SQL Server中最常用的一个日期函数,用于获取当前系统的日期和时间。函数不带任何参数,返回的是一个datetime类型的数据。例如,使用SELECT GETDATE()可以返回当前日期和时间。 2. YEAR、MONTH、DAY函数 这些...

    sql创建由日期生成生肖函数

    这个表包含了三个字段:`yearId`(年份ID)、`data`(数据,表现为十六进制字符串)和`dataInt`(整型数据)。接下来,我们将详细解析这一知识点,包括SQL语句的理解、表结构的设计思路以及可能的应用场景。 ### ...

    2021-2022收藏的精品资料Oracle日期函数大全.docx

    -- 使用FLOOR函数计算两个日期之间的天数 SELECT FLOOR(TO_DATE('2008-05-02 00:00:00', 'yyyy-mm-dd hh24-mi-ss') - TO_DATE('2008-04-30 23:59:59', 'yyyy-mm-dd hh24-mi-ss')) AS 相差天数 FROM DUAL; -- 使用...

Global site tag (gtag.js) - Google Analytics