当前位置:文档之家› Oracle中日期函数的使用

Oracle中日期函数的使用

Oracle中日期函数的使用
Oracle中日期函数的使用

Oracle中日期函数的使用

2009/07/28 21:17[Oracle ]

相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle中应该怎么来写sql语句呢,这个时候Oracle的日期函数会给我们很多帮助。

计算2个日期间间隔时间:

select to_date('2004/10/10 08:00:00','yyyy/mm/dd hh24:mi:ss')-to_date('2004/10/01 16:00:00','yyyy/mm/dd hh24:mi:ss') data_num from dual

select to_date('2004/10/10','yyyy/mm/dd')-to_date('2004/10/01','yyyy/mm/dd') from dual 结果为9

select

to_date(to_char(sysdate,'yyyy/mm/dd'),'yyyy/mm/dd')-to_date('2009/04/01','yyyy/m m/dd') from dual

常用日期型函数

1。Sysdate 当前日期和时间

SQL> Select sysdate from dual;

SYSDATE

----------

21-6月-05

2。Last_day 本月最后一天

SQL> Select last_day(sysdate) from dual;

LAST_DAY(S

----------

30-6月-05

3。Add_months(d,n) 当前日期d后推n个月

用于从一个日期值增加或减少一些月份

date_value:=add_months(date_value,number_of_months)

SQL> Select add_months(sysdate,2) from dual;

ADD_MONTHS

----------

21-8月-05

4。Months_between(f,s) 日期f和s间相差月数

SQL> select months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))from dual;

MONTHS_BETWEEN(SYSDATE,TO_DATE('2005-11-12','YYYY-MM-DD'))

----------------------------------------------------------

-4.6966741

5。NEXT_DAY(d, day_of_week)

返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。

SQL> SELECT next_day(to_date('20050620','YYYYMMDD'),1) FROM dual;

NEXT_DAY(T

----------

26-6月-05

6。current_date()返回当前会话时区中的当前日期

date_value:=current_date

SQL> column sessiontimezone for a15

SQL> select sessiontimezone,current_date from dual;

SESSIONTIMEZONE CURRENT_DA

--------------- ----------

+08:00 13-11月-03

SQL> alter session set time_zone='-11:00' 2 /

会话已更改。

SQL> select sessiontimezone,current_timestamp from dual;

SESSIONTIMEZONE CURRENT_TIMESTAMP

--------------- ------------------------------------

-11:00 12-11月-03 04.59.13.668000 下午-11:00

7。current_timestamp()以timestamp with time zone数据类型返回当前会话时区中的当前日期SQL> select current_timestamp from dual;

CURRENT_TIMESTAMP

---------------------------------------------------------------------------

21-6月-05 10.13.08.220589 上午+08:00

8。dbtimezone()返回时区

SQL> select dbtimezone from dual;

DBTIME

------

-08:00

9。extract()找出日期或间隔值的字段值

date_value:=extract(date_field from [datetime_value|interval_value])

SQL> select extract(month from sysdate) "This Month" from dual;

This Month

----------

6

SQL> select extract(year from add_months(sysdate,36)) " Years" from dual;

Years

----------

2008

10。localtimestamp()返回会话中的日期和时间

SQL> select localtimestamp from dual;

LOCALTIMESTAMP

---------------------------------------------------------------------------

21-6月-05 10.18.15.855652 上午

常用日期数据格式(该段为摘抄)

Y或YY或YYY 年的最后一位,两位或三位Select to_char(sysdate,’YYY’) from dual;002表示2002年

SYEAR或YEAR SYEAR使公元前的年份前加一负号Select to_char(sysdate,’SYEAR’) from dual;-1112表示公元前111 2年

Q 季度,1~3月为第一季度Select to_char(sysdate,’Q’) fr om dual;2表示第二季度①

MM 月份数Select to_char(sysdate,’MM’) from dual;12表示12月

RM 月份的罗马表示Select to_char(sysdate,’RM’) from dual;IV表示4月

Month 用9个字符长度表示的月份名Select to_char(sysdate,’Month’) from dual;May后跟6个空格表示5月

WW 当年第几周Select to_char(sysdate,’WW’) from dual;24表示2002年6月13日为第24周

W 本月第几周Select to_char(sysdate,’W’) from dual;2002年10月1日为第1周

DDD 当年第几, 1月1日为001,2月1日为032 Select to_char(sysdate,’DDD’) from dual;363 2002年1 2月2 9日为第363天

DD 当月第几天Select to_char(sysdate,’DD’) from dual;04 10月4日为第4天

D 周内第几天Select to_char(sysdate,’D’) from dual;5 2002年3月14日为星期一

DY 周内第几天缩写Select to_char(sysdate,’DY’) from dual;SUN 2002年3月24日为星期天HH或HH12 12进制小时数Select to_char(sysdate,’HH’) from dual;02 午夜2点过8分为02

HH24 24小时制Select to_char(sysdate,’HH24’) from dual;14 下午2点08分为14

MI 分钟数(0~59) Select to_char(sysdate,’MI’) from dual;17下午4点17分

SS 秒数(0~59) Select to_char(sysdate,’SS’) from dual;22 11点3分22秒

提示注意不要将MM格式用于分钟(分钟应该使用MI)。MM是用于月份的格式,将它用于分钟也能工作,但结果是错误的。

现在给出一些实践后的用法:

1。上月末天:

SQL> select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from dual;

LASTDAY

----------

2005-05-31

2。上月今天

SQL> select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;

PRETODAY

----------

2005-05-21

3.上月首天

SQL> select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;

FIRSTDAY

----------

2005-05-01

4.按照每周进行统计

SQL> select to_char(sysdate,'ww') from dual group by to_char(sysdate,'ww');

TO

--

25

5。按照每月进行统计

SQL> select to_char(sysdate,'mm') from dual group by to_char(sysdate,'mm');

TO

06

6。按照每季度进行统计

SQL> select to_char(sysdate,'q') from dual group by to_char(sysdate,'q');

T

-

2

7。按照每年进行统计

SQL> select to_char(sysdate,'yyyy') from dual group by to_char(sysdate,'yyyy');

TO_C

----

2005

8.要找到某月中所有周五的具体日期

select to_char(t.d,'YY-MM-DD') from (

select trunc(sysdate, 'MM')+rownum-1 as d

from dba_objects

where rownum < 32) t

where to_char(t.d, 'MM') = to_char(sysdate, 'MM') --找出当前月份的周五的日期

and trim(to_char(t.d, 'Day')) = '星期五'

--------

03-05-02

03-05-09

03-05-16

03-05-23

03-05-30

如果把where to_char(t.d, 'MM') = to_char(sysdate, 'MM')改成sysdate-90,即为查找当前月份的前三个月中的每周五的日期。

9.oracle中时间运算

内容如下:

1、oracle支持对日期进行运算

2、日期运算时是以天为单位进行的

3、当需要以分秒等更小的单位算值时,按时间进制进行转换即可

4、进行时间进制转换时注意加括号,否则会出问题

SQL> alter session set nls_date_format='yyyy-mm-dd hh:mi:ss';

会话已更改。

SQL> set serverout on

SQL> declare

2 DateValue date;

3 begin

4 select sysdate into DateValue from dual;

5 dbms_output.put_line('源时间:'||to_char(DateValue));

6 dbms_output.put_line('源时间减1天:'||to_char(DateValue-1));

7 dbms_output.put_line('源时间减1天1小时:'||to_char(DateValue-1-1/24));

8 dbms_output.put_line('源时间减1天1小时1

分:'||to_char(DateValue-1-1/24-1/(24*60)));

9 dbms_output.put_line('源时间减1天1小时1分1

秒:'||to_char(DateValue-1-1/24-1/(24*60)-1/(24*60*60)));

10 end;

11 /

源时间:2003-12-29 11:53:41

源时间减1天:2003-12-28 11:53:41

源时间减1天1小时:2003-12-28 10:53:41

源时间减1天1小时1分:2003-12-28 10:52:41

源时间减1天1小时1分1秒:2003-12-28 10:52:40

PL/SQL 过程已成功完成。

在Oracle中实现时间相加处理

-- 名称:Add_Times

-- 功能:返回d1与NewTime相加以后的结果,实现时间的相加

-- 说明:对于NewTime中的日期不予考虑

-- 日期:2004-12-07

-- 版本:1.0

-- 作者:Kevin

create or replace function Add_Times(d1 in date,NewTime in date) return date is

hh number;

mm number;

ss number;

hours number;

dResult date;

begin

-- 下面依次取出时、分、秒

select to_number(to_char(NewTime,'HH24')) into hh from dual;

select to_number(to_char(NewTime,'MI')) into mm from dual;

select to_number(to_char(NewTime,'SS')) into ss from dual;

-- 换算出NewTime中小时总和,在一天的百分几

hours := (hh + (mm / 60) + (ss / 3600))/ 24;

-- 得出时间相加后的结果

select d1 + hours into dResult from dual;

return(dResult);

end Add_Times;

-- 测试用例

-- select Add_Times(sysdate,to_date('2004-12-06 03:23:00','YYYY-MM-DD HH24:MI:SS')) from dual

在Oracle9i中计算时间差

计算时间差是Oracle DATA数据类型的一个常见问题。Oracle支持日期计算,你可以创建诸如“日期1-日期2”这样的表达式来计算这两个日期之间的时间差。

一旦你发现了时间差异,你可以使用简单的技巧来以天、小时、分钟或者秒为单位来计算时间差。为了得到数据差,你必须选择合适的时间度量单位,这样就可以进行数据格式隐藏。

使用完善复杂的转换函数来转换日期是一个诱惑,但是你会发现这不是最好的解决方法。

round(to_number(end-date-start_date))- 消逝的时间(以天为单位)

round(to_number(end-date-start_date)*24)- 消逝的时间(以小时为单位)

round(to_number(end-date-start_date)*1440)- 消逝的时间(以分钟为单位)

显示时间差的默认模式是什么?为了找到这个问题的答案,让我们进行一个简单的SQL *Plus查询。SQL> select sysdate-(sysdate-3) from dual;

SYSDATE-(SYSDATE-3)

-------------------

3

这里,我们看到了Oracle使用天来作为消逝时间的单位,所以我们可以很容易的使用转换函数来把它转换成小时或者分钟。然而,当分钟数不是一个整数时,我们就会遇到放置小数点的问题。

Select

(sysdate-(sysdate-3.111))*1440

from

dual;

(SYSDATE-(SYSDATE-3.111))*1440

------------------------------

4479.83333

当然,我们可以用ROUND函数(即取整函数)来解决这个问题,但是要记住我们必须首先把DATE数据类型转换成NUMBER数据类型。

Select

round(to_number(sysdate-(sysdate-3.111))*1440)

from

dual;

ROUND(TO_NUMBER(SYSDATE-(SYSDATE-3.111))*1440)

----------------------------------------------

4480

我们可以用这些函数把一个消逝时间近似转换成分钟并把这个值写入Oracle表格中。在这个例子里,我们有一个离线(logoff)系统级触发机制来计算已经开始的会话时间并把它放入一个Oracle STATSPACK USER_LOG扩展表格之中。

Update

perfstat.stats$user_log

set

elapsed_minutes =

round(to_number(logoff_time-logon_time)*1440)

where

user = user_id

and

elapsed_minutes is NULL;

查出任一年月所含的工作日

CREATE OR REPLACE FUNCTION Get_WorkingDays(

ny IN VARCHAR2

) RETURN INTEGER IS

/*------------------------------------------------------------------------------------------

函数名称:Get_WorkingDays

中文名称:求某一年月中共有多少工作日

作者姓名: XINGPING

编写时间: 2004-05-22

输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405

返回值:整型值,包含的工作日数目。

算法描述:

1).列举出参数给出的年月中的每一天。这里使用了一个表(ljrq是我的库中的一张表。这个表可以是有权访问的、记录条数至少为31的任意一张表或视图)来构造出某年月的每一天。

2).用这些日期和一个已知星期几的日期相减(2001-12-30是星期天),所得的差再对7求模。如果所求年月在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模.

3).过滤掉结果集中值为0和6的元素,然后求count,所得即为工作日数目。

-------------------------------------------------------------------------------------------------*/ Result INTEGER;

BEGIN

SELECT COUNT(*) INTO Result

FROM (SELECT MOD(MOD(q.rq-to_date('2001-12-30','yyyy-mm-dd'),7),7) weekday FROM ( SELECT to_date(ny||t.dd,'yyyymmdd') rq

FROM (SELECT substr(100+ROWNUM,2,2) dd

FROM ljrq z WHERE Rownum<=31

) t

WHERE to_date(ny||t.dd,'yyyymmdd')

BETWEEN to_date(ny,'yyyymm')

AND last_day(to_date(ny,'yyyymm'))

)q

) a

WHERE a.weekday NOT IN(0,6);

RETURN Result;

END Get_WorkingDays;

______________________________________

还有一个版本

CREATE OR REPLACE FUNCTION Get_WorkingDays(

ny IN VARCHAR2

) RETURN INTEGER IS

/*-----------------------------------------------------------------------------------------

函数名称:Get_WorkingDays

中文名称:求某一年月中共有多少工作日

作者姓名: XINGPING

编写时间: 2004-05-23

输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405

返回值:整型值,包含的工作日数目。

算法描述:使用Last_day函数计算出参数所给年月共包含多少天,根据这个值来构造一个循环。在这个循环中先求这个月的每一天与一个已知是星期天的日期(2001-12-30是星期天)的差,所得的差再对7求模。如果所求日期在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. 如过所得值不等于0和6(即不是星期六和星期天),则算一个工作日。

----------------------------------------------------------------------------------------*/ Result INTEGER := 0;

myts INTEGER; --所给年月的天数

scts INTEGER; --某天距2001-12-30所差的天数

rq DATE;

djt INTEGER := 1; --

BEGIN

myts := to_char(last_day(to_date(ny,'yyyymm')),'dd');

LOOP

rq := TO_date(ny||substr(100+djt,2),'yyyymmdd');

scts := rq - to_date('2001-12-30','yyyy-mm-dd');

IF MOD(MOD(scts,7)+7,7) NOT IN(0,6) THEN

Result := Result + 1;

END IF;

djt := djt + 1;

EXIT WHEN djt>myts;

END LOOP;

RETURN Result;

END Get_WorkingDays;

以上两个版本的比较

第一个版本一条SQL语句就可以得出结果,不需要编程就可以达到目的。但需要使用任意一张有权访问的、记录条数至少为31的一张表或视图。

第二个版本需要编程,但不需要表或者视图。

这两个版本都还存在需要完善的地方,即没有考虑节日,如五一、十一、元旦、春节这些节假期都没有去除。这些节假日应该维护成一张表,然后通过查表来去除这些节假日。

Oracle 获取系统日期,日期转换函数

Oracle 获取系统日期,日期转换函数 learning oracle 获取系统日期和日期转换函数应用获取系统日期:SYSDA TE() 格式化日期:TO_CHAR(SYSDATE(),'YY/MM/DD HH24:MI:SS) 或TO_DATE(SYSDA TE(),'YY/MM/DD HH24:MI:SS) 格式化数字:TO_NUMBER 注:TO_CHAR 把日期或数字转换为字符串 TO_CHAR(number, '格式') TO_CHAR(salary, '$99,999.99') TO_CHAR(date, '格式') TO_DATE 把字符串转换为数据库中的日期类型 TO_DATE(char, '格式') TO_NUMBER 将字符串转换为数字 TO_NUMBER(char, '格式') 返回系统日期,输出25-12月-09 select sysdate from dual; mi是分钟,输出2009-12-25 14:23:31 select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual; mm会显示月份,输出2009-12-25 14:12:31 select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual; 输出09-12-25 14:23:31 select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual 输出2009-12-25 14:23:31 select to_date('2009-12-25 14:23:31','yyyy-mm-dd,hh24:mi:ss') from dual 而如果把上式写作: select to_date('2009-12-25 14:23:31','yyyy-mm-dd,hh:mi:ss') from dual 则会报错,因为小时hh是12进制,14为非法输入,不能匹配。 输出$10,000,00 : select to_char(1000000,'$99,999,99') from dual; 输出RMB10,000,00 : select to_char(1000000,'L99,999,99') from dual; 输出1000000.12 : select trunc(to_number('1000000.123'),2) from dual; select to_number('1000000.123') from dual; 转换的格式: 表示year 的:y 表示年的最后一位、 yy 表示年的最后2位、 yyy 表示年的最后3位、 yyyy 用4位数表示年 表示month的:mm 用2位数字表示月、 mon 用简写形式,比如11月或者nov 、 month 用全称,比如11月或者november 表示day的:dd 表示当月第几天、 ddd 表示当年第几天、

Oracle的to_date函数

Oracle的to_date函数 日期格式参数含义说明 D一周中的星期几 DAY天的名字,使用空格填充到9个字符 DD月中的第几天 DDD年中的第几天 DY天的简写名 IW ISO标准的年中的第几周 IYYYISO标准的四位年份 YY四位年份 YYY,YY,Y年份的最后三位,两位,一位 HH小时,按12小时计 HH24小时,按24小时计 MI分 SS秒 MM月 Mon月份的简写注: 在不同的语言下显示出来的数据不同,在中文下显示为5月,在英文下显示为MAY Month月份的全名 W该月的第几个星期

WW年中的第几个星期 1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate -interval ’7’ MINUTE from dual 当前时间减去7小时的时间 select sysdate -interval ’7’ hour from dual 当前时间减去7天的时间 select sysdate - interval ’7’ day from dual 当前时间减去7月的时间 select sysdate,sysdate -interval ’7’ month from dual 当前时间减去7年的时间 select sysdate,sysdate -interval ’7’ year from dual 时间间隔乘以一个数字 select sysdate,sysdate -8 *interval ’2’ hour from dual 2.日期到字符操作 select sysdate,to_char(sysdate,’y y-mm-dd hh24:mi: ss’) from dual select sysdate,to_char(sysdate,’yy-mm-dd hh: mi: ss’) from dual select sysdate,to_char(sysdate,’yy-ddd hh:

Oracle BIEE 时间函数 (ago,todate)

Oracle BIEE 中的时间维与时间轴函数 累计、同比、环比是BI 项目中常用的分析方法。本文讲述如何利用Oracle BIEE 的时间维(Time Dimension)及时间轴函数(Time Series Conversion Function)实现累计、同比、环比计算。本文使用的示例数据可以通过此链接下载:https://www.doczj.com/doc/6917577384.html,/。如果你不了解如何创建Oracle BIEE 资料库,请参考之前的文章Hello BIEE。 目录 ?时间轴函数概述 ?创建时间维的准备工作 ?创建时间维 ?使用时间轴函数定义度量值 ?查询 ?参考 时间轴函数概述 累计、同比、环比是BI 项目中常用的分析方法。如果采用关系型数据库,直接通过SQL 语句进行这样的计算是比较麻烦的。Oracle BIEE 提供的解决方法是时间轴函数。时间轴函数是位于逻辑模型层内的函数,使用时间轴函数能够定义出“去年同期值”或“本年累计值”之类的与时间相关的计算字段。Oracle BIEE 现在支持两个时间轴函数: ?Ago:从当前时间起回溯用户指定的n 个时间段,返回当时的度量值。 ?ToDate:从用户指定时间段的起点开始,到当前时间为止,计算度量值的累计值。 使用时间轴函数的前提条件是在逻辑模型内定义了时间维。上面两个函数说明中的“时间段”实际上指的是时间维的层级(Level)。例如使用Ago 函数定义“去年同期值”,指定的时间段为“年”这一层级,指定的回溯周期为1,表示得到去年的值。再比如使用ToDate 函数定义“本年累计值”,指定的时间段也是“年”这一层级,表示从年的起点(年初)开始到当前时间为止,求度量值的累计值。 创建时间维的准备工作 时间维的创建过程与创建普通维度基本相同,只是维度对象的某些设置不同。因此创建物理模型、逻辑模型、及展现模型的过程在此不细说了,如果你不了解请参考之前的文章Hello BIEE。 在物理模型层,导入时间维表V_COMMON_DATE;将V_COMMON_DATE.DAY_ID 定义为V_COMMON_DATE 的主键;将V_COMMON_DATE.DAY_ID 定义为 V_FINANCE_EXPENSE.CONSUME_DATE 的外键。

Oracle常用函数及使用案例(珍藏版)

Oracle常用函数及使用案例(珍藏版) 一:sql函数: lower(char):将字符串转化为小写的格式。 upper(char):将字符串转化为大写的格式。 length(char):返回字符串的长度。 substr(char,m,n):取字符串的字串。 案例1.将所有员工的名字按小写的方式显示 select lower(ename),sal from emp; 案例2.将所有员工的名字按大写的方式显示。 select upper(ename),sal from emp; 案例3.显示正好为五个字符的的员工的姓名。 select * from emp where length(ename)=5; 案例4.显示所有员工姓名的前三个字符。 select substr(ename,1,3) from emp;//从名字的第一个字符开始取,向后取三个字符。 案例5.以首字母为大写的方式显示所有员工的姓名。 (1)首字母大写:select upper(substr(ename,1,1)) from emp; (2)完成后面字母小写。select lower(substr(ename,2,length(ename)-1)) from emp; (3)合并select upper(substr(ename,1,1))||lower(substr(ename,2,length(ename)-1)) from emp; 案例6.以首字母为小写的方式显示所有员工的姓名。(需要有较高的灵活度,细心分析和清晰思路) (1)首字母小写:select upper(substr(ename,1,1)) from emp; (2)完成后面字母大写。select lower(substr(ename,2,length(ename)-1)) from emp; (3)合并select lower(substr(ename,1,1))||upper(substr(ename,2,length(ename)-1)) from emp; 案例7.函数(替换):replace(char1,search_string,replace_string); 显示所有员工的姓名,用“我要替换A”替代所有“A”。 select replace(ename,'A','我是老鼠')from emp; 案例8.以首字母为小写的方式显示所有员工的姓名。 select replace(ename,substr(ename,1,1),lower(substr(ename,1,1)))from emp; 案例9.以首字母为大写的方式显示所有员工的姓名。 Select replace(ename,substr(ename,2,length(ename)-1),lower(substr(ename,2,length(ename) -1)))from emp; 二:数学函数:(在财务中用的比较多) ronud(sal)用于四舍五默认取整; ronud(sal,1)用于四舍五留一位小数。 trunc(sal)取整,忽略小数。截去小数部分。 trunc(sal,1)截取;小数点留一位,之后的右边的省去。 trunc(sal,-1)截取;只留整数,个位数取零。 floor(sal)向下最接近取整;比如1.1值为1.

Oracle中trunc()函数用法处理日期、数字类型数据

trunc()函数用法处理日期、数字类型数据 一、日期 TRUNC函数为指定元素而截去的日期值。 其具体的语法格式如下: TRUNC(date[,fmt]) 其中: date一个日期值 fmt日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去如果当日日期是:2011-3-18 1.select trunc(sysdate) from dual --2011-3-18今天的日期为2011-3-18 2.select trunc(sysdate, 'mm') from dual --2011-3-1返回当月第一天. 3.select trunc(sysdate,'yy') from dual --2011-1-1返回当年第一天 4.select trunc(sysdate,'dd') from dual --2011-3-18返回当前____年__月__日 5.select trunc(sysdate,'yy') from dual --2011-1-1返回当年第一天 6.select trunc(sysdate,'d') from dual --2011-3-13 (星期天)返回当前星期的第一天 7.select trunc(sysdate, 'hh') from dual --2011-3-18 14:00:00当前时间为14:41 8.select trunc(sysdate, 'mi') from dual --2011-3-18 14:41:00 TRUNC()函数没有秒的精确 二、数字 TRUNC(number,num_digits) Number需要截尾取整的数字。

ORACLE时间函数

ORACLE时间函数: sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdate+5/24 在系统时间基础上延迟5小时 sysdate+5 在系统时间基础上延迟5天 add_months(sysdate,-5) 在系统时间基础上延迟5月 add_months(sysdate,-5*12) 在系统时间基础上延迟5年 上月末的日期:select last_day(add_months(sysdate, -1)) from dual; 本月的最后一秒:select trunc(add_months(sysdate,1),'MM') - 1/24/60/60 from dual 本周星期一的日期:select trunc(sysdate,'day')+1 from dual 年初至今的天数:select ceil(sysdate - trunc(sysdate, 'year')) from dual; 今天是今年的第几周 :select to_char(sysdate,'fmww') from dual 今天是本月的第几周:SELECT TO_CHAR(SYSDATE,'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1 AS "weekOfMon" FROM dual 本月的天数 SELECT to_char(last_day(SYSDATE),'dd') days FROM dual 今年的天数 select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 下个星期一的日期 SELECT Next_day(SYSDATE,'monday') FROM dual ======================================= ===== --计算工作日方法 create table t(s date,e date); alter session set nls_date_format = 'yyyy-mm-dd'; insert into t values('2003-03-01','2003-03-03'); insert into t values('2003-03-02','2003-03-03'); insert into t values('2003-03-07','2003-03-08'); insert into t values('2003-03-07','2003-03-09'); insert into t values('2003-03-05','2003-03-07'); insert into t values('2003-02-01','2003-03-31'); -- 这里假定日期都是不带时间的,否则在所有日期前加trunc即可。 select s,e,e-s+1 total_days, trunc((e-s+1)/7)*5 + length(replace(substr('01111100111110',to_char(s,'d'),mod(e-s+1,7

Oracle中TO_DATE函数

Oracle中TO_DATE函数 Oracle中TO_DATE格式 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年显示值:07 yyy three digits 三位年显示 值:007 yyyy four digits 四位年显示值:2007 Month: mm number 两位月显示值:11 mon abbreviated 字符集表示显示值:11月,若是英文版,显示nov month spelled out 字符集表示显示值:11月,若是英文版,显示november

Day: dd number 当月第几天显示值:02 ddd number 当年第几天显示值:02 dy abbreviated 当周第几天简写显示值:星期五,若是英文版,显示fri day spelled out 当周第几天全写显示值:星期五,若是英文版,显示friday ddspth spelled out, ordinal twelfth Hour: hh two digits 12小时进制 显示值:01 hh24 two digits 24小时进制显示值:13 Minute: mi two digits 60进制 显示值:45 Second:

ss two digits 60进制 显示值:25 其它 Q digit 季度 显示值:4 WW digit 当年第几周 显示值:44 W digit 当月第几周 显示值:1 24小时格式下时间范围为:0:00:00 - 23:59:59.... 12小时格式下时间范围为:1:00:00 - 12:59:59 .... 1. 日期和字符转换函数用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串 select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年 select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月

oracle SQL里常用的时间函数

oracle SQL里常用的时间函数,经典推荐 相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle 中应该怎么来写sql语句呢,这个时候Oracle的日期函数会给我们很多帮助。 常用日期型函数 1。Sysdate 当前日期和时间 SQL> Select sysdate from dual; SYSDATE ---------- 21-6月-05 2。Last_day 本月最后一天 SQL> Select last_day(sysdate) from dual; LAST_DAY(S ---------- 30-6月-05 3。Add_months(d,n) 当前日期d后推n个月

用于从一个日期值增加或减少一些月份 date_value:=add_months(date_value,number_of_months) SQL> Select add_months(sysdate,2) from dual; ADD_MONTHS ---------- 21-8月-05 4。Months_between(f,s) 日期f和s间相差月数 SQL> select months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))fro m dual; MONTHS_BETWEEN(SYSDATE,TO_DATE('2005-11-12','YYYY-MM-D D')) ---------------------------------------------------------- -4.6966741 5。NEXT_DAY(d, day_of_week) 返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。

Oracle通过日期获取星座函数

Oracle通过日期获取星座函数 create or replace function get_xingzuo(dt in date) RETURN V ARCHAR2 is xingzuo VARCHAR2(20); dnum number(4); begin dnum:=to_number(to_char(dt,'MMdd')); select case when dnum>=1222 or dnum<=119 then '摩羯座' when dnum>=120 and dnum<=218 then '水瓶座' when dnum>=219 and dnum<=320 then '双鱼座' when dnum>=321 and dnum<=420 then '牡羊座' when dnum>=421 and dnum<=520 then '金牛座' when dnum>=521 and dnum<=621 then '双子座' when dnum>=622 and dnum<=722 then '巨蟹座' when dnum>=723 and dnum<=822 then '狮子座' when dnum>=823 and dnum<=922 then '处女座' when dnum>=923 and dnum<=1022 then '天秤座' when dnum>=1023 and dnum<=1121 then '天蝎座' when dnum>=1122 and dnum<=1221 then '射手座' end into xingzuo from dual; return xingzuo; end;

ORACLE日期函数01(1)

ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年显示值:07 yyy three digits 三位年显示值:007 yyyy four digits 四位年显示值:2007 Month: mm number 两位月显示值:11 mon abbreviated 字符集表示显示值:11月,若是英文版,显示nov month spelled out 字符集表示显示值:11月,若是英文版,显示november Day: dd number 当月第几天显示值:02 ddd number 当年第几天显示值:02 dy abbreviated 当周第几天简写显示值:星期五,若是英文版,显示fri day spelled out 当周第几天全写显示值:星期五,若是英文版,显示friday ddspth spelled out, ordinal twelfth Hour: hh two digits 12小时进制显示值:01 hh24 two digits 24小时进制显示值:13 Minute: mi two digits 60进制显示值:45 Second: ss two digits 60进制显示值:25 其它 Q digit 季度显示值:4 WW digit 当年第几周显示值:44 W digit 当月第几周显示值:1 24小时格式下时间范围为:0:00:00 - 23:59:59.... 12小时格式下时间范围为:1:00:00 - 12:59:59 .... 1. 日期和字符转换函数用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串

Oracle计算时间差函数

Oracle计算时间差函数 两个Date类型字段 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)*24*60) 秒 ROUND(TO_NUMBER(END_DATE-START_DATE)*24*60*60) 毫秒 ROUND(TO_NUMBER(END_DATE-START_DATE)*24*60*60*1000) Oracle计算时间差函数2008-08-20 10 00两个Date类型字段 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)*24*60)秒 ROUND(TO_NUMBER(END_DATE-START_DATE)*24*60*60)毫秒 ROUND(TO_NUMBER(END_DATE-START_DATE)*24*60*60*1000) 外加to_date与to_char函数 ORACLE中 select to_date('2007-06-28 19 51 20','yyyy-MM-dd HH24 mi

oracle常用函数使用大全

oracle常用函数使用大全 一、运算符 算术运算符:+ - * / 可以在select 语句中使用 连接运算符:|| select deptno|| dname from dept; 比较运算符:> >= = != < <= like between is null in 逻辑运算符:not and or 集合运算符:intersect ,union,union all,minus 要求:对应集合的列数和数据类型相同 查询中不能包含long 列 列的标签是第一个集合的标签 使用order by时,必须使用位置序号,不能使用列名 例:集合运算符的使用: intersect ,union,union all,minus select * from emp intersect select * from emp where deptno=10 ; select * from emp minus select * from emp where deptno=10; select * from emp where deptno=10 union select * from emp where deptno in (10,20); --不包括重复行 select * from emp where deptno=10 union all select * from emp where deptno in (10,20); --包括重复行 二.ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年显示值:07 yyy three digits 三位年显示值:007 yyyy four digits 四位年显示值:2007 Month: mm number 两位月显示值:11 mon abbreviated 字符集表示显示值:11月,若是英文版,显示nov month spelled out 字符集表示显示值:11月,若是英文版,显示november

Oracle日期函数大全

在oracle中有很多关于日期的函数,如: 1、add_months()用于从一个日期值增加或减少一些月份 date_value:=add_months(date_value,number_of_months) 例: SQL> select add_months(sysdate,12) "Next Year" from dual; Next Year ---------- 13-11月-04 SQL> select add_months(sysdate,112) "Last Year" from dual; Last Year ---------- 13-3月 -13 SQL> 2、current_date()返回当前会放时区中的当前日期 date_value:=current_date SQL> column sessiontimezone for a15 SQL> select sessiontimezone,current_date from dual; SESSIONTIMEZONE CURRENT_DA --------------- ---------- +08:00 13-11月-03 SQL> alter session set time_zone='-11:00' 2 / 会话已更改。 SQL> select sessiontimezone,current_timestamp from dual; SESSIONTIMEZONE CURRENT_TIMESTAMP --------------- ------------------------------------ -11:00 12-11月-03 04.59.13.668000 下午 -11: 00 SQL> 3、current_timestamp()以timestamp with time zone数据类型返回当前会放时区中的当前日期timestamp_with_time_zone_value:=current_timestamp([timestamp_precision]) SQL> column sessiontimezone for a15

Oracle 时间和日期函数

Oracle 时间和日期函数 在默认情况下,日期数据的格式是DD-MON-YY。其中,DD表示两位数字的日,MON 表示3位数的月份,YY表示两位数字的年。在插入数据时,默认也采用DD-MON-YY格式插入数据。 日期数据的格式由NLS_DATE_FORMA T系统参数来设置,该系统参数存储在INIT.ORA文件和SPFILE.ORA文件中。可以使用SHOW PARAMETERS命令查看这些系统参数的值,另外还可以通过ALTER SYSTEM或ALTER SESSION命令修改该系统参数。ALTER SYSTEM命令表示修改系统参数的文件,这种修改设置在以后的数据库操作中将一直起作用;在ALTER SESSION命令的设置只在当前的会话中起作用,该会话结束后,其设置就会失效。 在Oracle 11g中,系统提供了许多用于处理日期和时间的函数,表5-6描述了常用的日期、时间函数的类型和功能。 表5-6 日期和时间函数 函数说明 add_months(x,y) 在X给定的日期上增加Y个月。如果Y为负数,则表示从X 中减去Y个月 last_day(x) 返回包含在X中的月份的最后一天 months_between(x,y) 返回X和Y之间的月数 next_day(x,day) 返回紧接着X的下一天,参数DAY是一个字符串 sysdate() 返回当前系统的日期 current_date() 返回本地时区的当前日期 new_time(x ,time_zone1 ,time_zon 将时间X从时区TIME_ZONE1转变成时区TIME_ZONE2 e2) localtimestamp() 返回会话中的日期和时间 在Oracle系统中,MONTHS_BETWEEN()函数可以返回两个日期之间的月数,其结果值即可以是正数,也可以是负数。如果第一个参数指定的日期晚于第二个参数指定的日期,则结果值为负数。如下所示: SQL> select months_between(date'1981-11-26',sysdate) 2 from dual; MONTHS_BETWEEN(DATE'1981-11-26',SYSDA TE) ---------------------------------------- -316.76572

Oracle的日期函数(包含季度)

Oracle的日期函数 相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle中应该怎么来写sql语句呢,这个时候Oracle的日期函数会给我们很多帮助。 常用日期型函数 1。Sysdate 当前日期和时间 SQL> Select sysdate from dual; SYSDATE ---------- 21-6月 -05 2。Last_day 本月最后一天 SQL> Select last_day(sysdate) from dual; LAST_DAY(S ---------- 30-6月 -05 3。Add_months(d,n) 当前日期d后推n个月 用于从一个日期值增加或减少一些月份 date_value:=add_months(date_value,number_of_months) SQL> Select add_months(sysdate,2) from dual; ADD_MONTHS ---------- 21-8月 -05 4。Months_between(f,s) 日期f和s间相差月数 SQL> select months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))from dual; MONTHS_BETWEEN(SYSDA TE,TO_DA TE('2005-11-12','YYYY-MM-DD')) ---------------------------------------------------------- -4.6966741 5。NEXT_DAY(d, day_of_week) 返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。 SQL> SELECT next_day(to_date('20050620','YYYYMMDD'),1) FROM dual; NEXT_DAY(T

Oracle时间函数

常用日期型函数 1。Sysdate 当前日期和时间 SQL> Select sysdate from dual; SYSDATE ---------- 21-6月 -05 2。Last_day 本月最后一天 SQL> Select last_day(sysdate) from dual; LAST_DAY(S ---------- 30-6月 -05 3。Add_months(d,n) 当前日期d后推n个月 用于从一个日期值增加或减少一些月份 date_value:=add_months(date_value,number_of_months) SQL> Select add_months(sysdate,2) from dual; ADD_MONTHS ---------- 21-8月 -05 4。Months_between(f,s) 日期f和s间相差月数 SQL> select months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))from dual; MONTHS_BETWEEN(SYSDATE,TO_DATE('2005-11-12','YYYY-MM-DD')) ---------------------------------------------------------- -4.6966741 5。NEXT_DAY(d, day_of_week) 返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。 SQL> SELECT next_day(to_date('20050620','YYYYMMDD'),1) FROM dual; NEXT_DAY(T ---------- 26-6月 -05 6。current_date()返回当前会话时区中的当前日期

Oracle中的TO_DATE和TO_CHAR函数日期处理

Oracle中的TO_DATE和TO_CHAR函数日期处理 Oracle 中的 TO_DATE 和TO_CHAR函数 oracle 中 TO_DATE 函数的时间格式,以 2008-09-10 23:45:56 为例 格式说明显示值备注 Year(年): yy two digits(两位年) 08 yyy three digits(三位年) 008 yyyy four digits(四位年) 2008 Month(月): mm number(两位月) 09 mon abbreviated(字符集表示) 9月若是英文版, 则显示 sep month spelled out(字符集表示) 9月若是英文版, 则显示 september Day(日): dd number(当月第几天) 10 ddd number(当年第几天) 254 dy abbreviated(当周第几天简写) 星期三若是英文版, 则显示 wed day spelled out(当周第几天全写) 星期三若是英文版, 则显示 wednesday ddspth spelled out, ordinal twelfth tenth Hour(时): hh two digits(12小时进制) 11 hh24 two digits(24小时进制) 23 Minute(分): mi two digits(60进制) 45 Second(秒): ss two digits(60进制) 56 其他: Q digit(季度) 3 WW digit(当年第几周) 37 W digit(当月第几周) 2 说明: 12小时格式下时间范围为: 1:00:00 - 12:59:59(12 小时制下的 12:59:59 对应 24 小时制下的 00:59:59) 24小时格式下时间范围为: 0:00:00 - 23:59:59 1. 日期和字符转换函数用法(to_date,to_char)

Oracle BIEE 中的时间维与时间轴函数

Oracle BIEE 中的时间维与时间轴函数累计、同比、环比是 BI 项目中常用的分析方法。本文讲述如何利用 Oracle BIEE 的时间维(Time Dimension)及时间轴函数(Time Series Conversion Function)实现累计、同比、环比计算。本文使用的示例数据可以通过此链接下载:https://www.doczj.com/doc/6917577384.html,/。如果你不了解如何创建 Oracle BIEE 资料库,请参考之前的文章Hello BIEE。 目录 ?时间轴函数概述 ?创建时间维的准备工作 ?创建时间维 ?使用时间轴函数定义度量值 ?查询 ?参考 时间轴函数概述 累计、同比、环比是 BI 项目中常用的分析方法。如果采用关系型数据库,直接通过 SQL 语句进行这样的计算是比较麻烦的。Oracle BIEE 提供的解决方法是时间轴函数。时间轴函数是位于逻辑模型层内的函数,使用时间轴函数能够定义出“去年同期值”或“本年累计值”之类的与时间相关的计算字段。Oracle BIEE 现在支持两个时间轴函数: ?Ago:从当前时间起回溯用户指定的 n 个时间段,返回当时的度量值。 ?ToDate:从用户指定时间段的起点开始,到当前时间为止,计算度量值的累计值。 使用时间轴函数的前提条件是在逻辑模型内定义了时间维。上面两个函数说明中的“时间段”实际上指的是时间维的层级(Level)。例如使用 Ago 函数定义“去年同期值”,指定的时间段为“年”这一层级,指定的回溯周期为 1,表示得到去年的值。再比如使用 ToDate 函数定义“本年累计值”,指定的时间段也是“年”这一层级,表示从年的起点(年初)开始到当前时间为止,求度量值的累计值。 创建时间维的准备工作 时间维的创建过程与创建普通维度基本相同,只是维度对象的某些设置不同。因此创建物理模型、逻辑模型、及展现模型的过程在此不细说了,如果你不了解请参考之前的文章Hello BIEE。 在物理模型层,导入时间维表 V_COMMON_DATE;将 V_COMMON_DATE.DAY_ID 定义为 V_COMMON_DATE 的主键;将 V_COMMON_DATE.DAY_ID 定义为 V_FINANCE_EXPENSE.CONSUME_DATE 的外键。

oracle带时分秒日期的比较

oracle 中不带时分秒de字符串 to_date 转换时间后与带时分秒dedate型字段做带等值de比较 (>=,<=,=)时,由于字符串不带时分秒,所以转换后时分秒默认为00:00:00,oracle中比较date是以一个时间点来比较de,精确到秒甚至毫秒微秒纳秒,所以date字段de时分秒不为00:00:00de就与不带时分秒字符串转换后dedate匹配不上。示例:表中huhai_seq_value所you数据 MYDATE ----------- 2009-03-02 2009-03-02 2009-03-02 2009-03-03 2009-03-03 2009-03-03 --sql1: select hsv.mydate from huhai_seq_value hsv where hsv.mydate = to_date('2009-03-03','yyyy-mm-dd ');

sql1查询结果: MYDATE ----------- 2009-03-03 2009-03-03 --sql2: select hsv.mydate from huhai_seq_value hsv where to_char(hsv.mydate,'yyyy-mm-dd') = '2009-03-03'; sql查询结果: MYDATE ----------- 2009-03-03 2009-03-03 2009-03-03 结论:所以在做不带时分秒de日期比较时最好用to_char函数转换后与字符串比较。

用between比较两个时间 例 select * from tbl_name where issue_time between to_date('2007-04-12 23:59:59','YYYY-MM-DD HH24:MI:SS') and sysdate;

Oracle时间日期操作函数及使用示例

Oracle时间日期操作 sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdate+5/24 在系统时间基础上延迟5小时 sysdate+5 在系统时间基础上延迟5天 add_months(sysdate,-5) 在系统时间基础上延迟5月 add_months(sysdate,-5*12) 在系统时间基础上延迟5年 上月末的日期:select last_day(add_months(sysdate, -1)) from dual; 本月初的日期: 本月的最后一秒:select trunc(add_months(sysdate,1),'MM') - 1/24/60/60 from dual 本周星期一的日期:select trunc(sysdate,'day')+1 from dual Oracle 获取本周、本月、本季、本年的第一天和最后一天 --本周 select trunc(sysdate,'d')+1 from dual; select trunc(sysdate,'d')+7 from dual; --本月 select trunc(sysdate,'mm') from dual; select last_day(trunc(sysdate)) from dual; --本季 select trunc(sysdate,'Q') from dual; select add_months(trunc(sysdate,'Q'),3)-1 from dual; --本年 select trunc(sysdate,'yyyy') from dual; select add_months(trunc(sysdate,'yyyy'),12)-1 from dual; -- 获取上月的开始时间和结束时间 select to_char(to_date(to_char(add_months(sysdate,-1),'yyyy-mm'),'yyyy-mm'),'yyyy-mm-dd hh24:mi:ss') from dual; select to_char(to_date(to_char(sysdate,'yyyy-mm'),'yyyy-mm'),'yyyy-mm-dd hh24:mi:ss') from dual; -- 获取前一天的开始时间和结束时间 select to_char(to_date(to_char(sysdate-1,'yyyy-mm-dd'),'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss') from dual; select to_char(to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss') from dual; -- 获取上一个小时的开始时间和结束时间 select to_date(to_char(sysdate,'yyyy-mm-dd')||(to_char(sysdate,'hh24')-1),'yyyy-mm-dd hh24') from dual; select to_date(to_char(sysdate,'yyyy-mm-dd')||(to_char(sysdate,'hh24')),'yyyy-mm-dd hh24')

相关主题
文本预览
相关文档 最新文档