oracle日期时间类型
- 格式:doc
- 大小:101.00 KB
- 文档页数:19
oracle数据库基本数据类型
Oracle数据库有许多基本数据类型,包括:
1. 字符型:
- CHAR:固定长度的字符型,最长可达2000个字节。
- VARCHAR2:可变长度的字符型,最长可达4000字节。
- CLOB:用于存储大量文本数据的字符型,最长可达4GB。
- NCHAR:固定长度的Unicode字符型,最长可达2000个字节。
- NVARCHAR2:可变长度的Unicode字符型,最长可达4000字节。
- NCLOB:用于存储大量Unicode文本数据的字符型,最长可达4GB。
2. 数值型:
- NUMBER:用于存储数值数据的类型,包括整数和浮点数。
- BINARY_FLOAT:用于存储单精度浮点数。
- BINARY_DOUBLE:用于存储双精度浮点数。
3. 日期和时间型:
- DATE:用于存储日期和时间信息。
- TIMESTAMP:用于存储日期、时间和时区信息。
4. 二进制型:
- RAW:用于存储二进制数据的类型,最长可达2000字节。
- BLOB:用于存储大量二进制数据的类型,最长可达4GB。
5. BOOLEAN型:用于存储布尔值(TRUE或FALSE)。
这些基本数据类型可以通过组合和修饰符进行扩展和定制。
ORACLE时间常⽤函数(字段取年、⽉、⽇、季度)TO_DATE格式Day:dd number 12dy abbreviated friday spelled out fridayddspth spelled out, ordinal twelfthMonth:mm number 03mon abbreviated marmonth spelled out marchYear:yy two digits 98yyyy four digits 199824⼩时格式下时间范围为: 0:00:00 - 23:59:59.... 12⼩时格式下时间范围为: 1:00:00 - 12:59:59 ....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’) from 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分为14MI 分钟数(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)。
oracle中date类型格式在Oracle 数据库中,`DATE` 类型用于存储日期和时间信息。
日期格式在Oracle 中是通过日期格式模型指定的。
以下是一些常见的日期格式模型和它们的含义:1. `DD-MM-YYYY`:日-月-年-例如:01-02-2023 表示2023 年2 月1 日。
2. `MM/DD/YYYY`:月/日/年-例如:02/01/2023 表示2023 年2 月1 日。
3. `YYYY-MM-DD`:年-月-日-例如:2023-02-01 表示2023 年2 月1 日。
4. `YYYY-MM-DD HH24:MI:SS`:年-月-日时:分:秒(24小时制)-例如:2023-02-01 14:30:45 表示2023 年2 月1 日下午2 点30 分45 秒。
5. `MON DD, YYYY HH:MI:SS AM`:月日, 年时:分:秒AM/PM-例如:Feb 01, 2023 02:30:45 PM 表示2023 年2 月1 日下午2 点30 分45 秒。
这只是一些常见的日期格式示例,实际上有许多其他的日期格式可以在Oracle 中使用。
在进行数据库查询或插入操作时,你可以使用`TO_DATE` 函数将字符串转换为`DATE` 类型,或使用`TO_CHAR` 函数将`DATE` 类型格式化为字符串。
例如:```sql--将字符串转换为DATESELECT TO_DATE('2023-02-01', 'YYYY-MM-DD') FROM dual;--将DATE 格式化为字符串SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;```在这些例子中,`'YYYY-MM-DD'` 和`'YYYY-MM-DD HH24:MI:SS'` 是日期格式模型。
Oracle年月日时分秒的格式一、概述在数据库系统中,日期和时间的处理是非常重要的一个方面。
Oracle数据库提供了丰富的日期和时间函数,可以满足不同的需求。
其中,日期和时间的格式化是其中的关键操作之一。
在Oracle中,我们可以使用不同的格式来表示年月日时分秒。
本文将详细介绍Oracle中年月日时分秒的格式化方法。
二、日期和时间的数据类型在Oracle数据库中,日期和时间被定义为特殊的数据类型。
主要的数据类型有DATE、TIMESTAMP和TIMESTAMP WITH TIME ZONE等。
这些数据类型可以存储年月日时分秒的信息。
2.1 DATE数据类型DATE数据类型是Oracle中最常用的日期和时间数据类型。
它可以存储从公元前4712年到公元9999年的日期和时间。
DATE数据类型的格式默认为”YYYY-MM-DD HH24:MI:SS”,其中YYYY表示年份,MM表示月份,DD表示日期,HH24表示小时(24小时制),MI表示分钟,SS表示秒钟。
2.2 TIMESTAMP数据类型TIMESTAMP数据类型是Oracle中用于存储日期和时间信息的另一种数据类型。
它可以存储更精确的时间信息,包括毫秒级别的精度。
TIMESTAMP数据类型的格式也是”YYYY-MM-DD HH24:MI:SS.FF”,其中FF表示毫秒。
2.3 TIMESTAMP WITH TIME ZONE数据类型TIMESTAMP WITH TIME ZONE数据类型是一种带有时区信息的日期和时间数据类型。
它可以存储时区偏移量,以便在不同的时区中正确地显示日期和时间。
TIMESTAMP WITH TIME ZONE数据类型的格式与TIMESTAMP数据类型相同。
三、日期和时间的格式化在Oracle数据库中,可以使用不同的函数来格式化日期和时间。
常用的函数有TO_CHAR、TO_DATE和TO_TIMESTAMP等。
3.1 TO_CHAR函数TO_CHAR函数用于将日期和时间数据类型转换为指定的字符串格式。
oracle年月格式
在Oracle数据库中,有几种常见的日期和时间格式,可以用来表示年月。
以下是其中一些常用的格式:
1. YYYY-MM: 这是ISO标准的年月格式,其中YYYY表示四位数的年份,MM表示两位数的月份。
例如,2022年1月可以表示为"2022-01"。
2. YYYYMM: 这是一种紧凑的年月格式,其中YYYY表示四位数的年份,MM表示两位数的月份。
例如,2022年1月可以表示为"202201"。
3. MM/YYYY: 这是一种常见的月年格式,其中MM表示两位数的月份,YYYY表示四位数的年份。
例如,1月2022年可以表示为"01/2022"。
4. MON-YYYY: 这是一种缩写的月年格式,其中MON表示月份的缩写,YYYY表示四位数的年份。
例如,1月2022年可以表示为"JAN-2022"。
5. MONTH YYYY: 这是一种完整的月年格式,其中MONTH表示月份的全名,YYYY表示四位数的年份。
例如,1月2022年可以表示为"January 2022"。
需要注意的是,Oracle数据库中的日期和时间格式可以通过使用TO_CHAR函数将日期类型的数据转换为字符串来实现。
例如,可以使用以下语句将日期字段转换为指定的年月格式:
sql.
SELECT TO_CHAR(date_column, 'YYYY-MM') FROM table_name;
以上是一些常见的Oracle年月格式,你可以根据具体需求选择适合的格式进行使用。
①Oracle中的日期时间存储:oracle数据库中存放时间格式的数据,是以oracle特定的格式存贮的,占7个字节,与查询时显示的时间格式无关。
不存贮秒以下的时间单位。
②Oracle中的日期时间显示:通常,客户端与数据库建立起连接后,oracle就会给一个缺省的时间格式数据的显示形式,与所使用的字符集有关。
一般显示年月日,而不显示时分秒。
③Oracle中的日期时间插入:向表中插入数据时,如果不使用转换函数,则时间字段的格式必须遵从会话环境的时间格式,否则不能插入。
④Oracle中的日期时间格式修改:a.SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';b.册表\hkey_local_machine\software\oracle\home0主键中增加一个字串(8i版本),字串名为nls_date_format,字串的值为你希望定义的时间格式前者只对当前会话有效,也即是一旦你关闭了SQL*PLUS窗口或重新打开一个SQL*PLUS窗口,日期时间格式依然采用本地字符集对应的日期时间格式。
后者对所有客户端应用有效。
当两者同时应用时,以alter session的修改为准。
一、Oracle的日期函数:Oracle从8i开始就提供了大量的日期函数,这些日期函数包括对日期进行加减、转换、截取等功能。
下面是Oracle提供的日期函数一览表二、日期加减:在Oralce中,对日期进行加减操作的默认单位是天,也就是说如果我们向当前日期加1的话是加上一天,而不是一秒或一小时。
那么对一天中的一段时间进行加减要怎么做呢?很简单!只需将它们转化为以天为单位即可。
【1】为当前时间加上30分钟:SQL>select to_char(sysdate, 'yyyy-mm-dd hh:mi:ss') now_date,2 to_char(sysdate+(30/24/60), 'yyyy-mm-dd hh:mi:ss') new_date3from dual;NOW_DATE NEW_DATE-------------------------------------- --------------------------------------2008-06-3010:47:312008-06-3011:17:31SQL>我们看到了在绿色高亮处使用30/24/60将分钟转换成天。
Oracle的todate用法1. 什么是Oracle的todate函数?在Oracle数据库中,todate是一个非常重要的函数,它用于将日期字符串转换为日期类型。
todate函数接受两个参数:第一个参数是日期字符串,第二个参数是日期格式模式。
2. todate函数的语法todate(date_string, format)•date_string: 一个表示日期的字符串。
•format: 可选参数,指定了日期字符串的格式模式。
3. todate函数支持的格式模式以下是一些常用的日期格式模式:•YYYY-MM-DD: 年-月-日•YYYY/MM/DD: 年/月/日•DD-MM-YYYY: 日-月-年•DD/MM/YYYY: 日/月/年•MM-DD-YYYY: 月-日-年•MM/DD/YYYY: 月/日/年此外,还有其他一些可以使用的格式模式,如:•YY-MM-DD HH24:MI:SS•YY/MM/DD HH24:MI:SS•YY/MM/DD HH12:MI:SS AM4. todate函数示例下面给出一些示例来演示todate函数的使用。
示例1:将字符串转换为日期类型假设我们有一个表格名为employees,其中有一个列名为hire_date。
该列存储了员工入职日期的信息。
现在我们想要将一个日期字符串'2022-01-01'插入到该列中。
INSERT INTO employees (hire_date) VALUES (todate('2022-01-01', 'YYYY-MM-DD'));示例2:将日期字符串转换为特定格式假设我们有一个表格名为orders,其中有一个列名为order_date。
该列存储了订单的下单日期信息。
现在我们想要查询出所有订单的下单日期,并以特定的格式显示。
SELECT to_char(order_date, 'YYYY年MM月DD日') AS formatted_order_dateFROM orders;示例3:将字符串转换为时间戳类型假设我们有一个表格名为logs,其中有一个列名为log_time。
Oracle批量删除表、索引等对象、批量恢复Drop操作删除的表、索引等对象虽然能够恢复表结构和数据,但是索引,主键,约束等,并不能完全恢复。
/**********************************************************************查询Drop操作删除的对象select * from recyclebin ;单个对象(表、索引或是通过drop操作删除的其它对象)恢复flashback table(被删除的对象类型)被删除的对象名称to before drop***********************************************************************/--Demo单张表恢复flashback table Table_XXX to before drop;-- 创建批量恢复表的存储过程create or replace procedure RecoveryOfTable isbegindeclare/*********************************************************************** select 'flashback table '||a.original_name||' to before drop' fromrecyclebin a where a.operation = 'DROP' and a.type='TABLE'恢复其它类型对象请将flashback table 这里换为其它类型,type='相应的类型'可加更多条件限制,具体查询recyclebin***********************************************************************/ cursor cur_flashback is select 'flashback table '||a.original_name||' to before drop' from recyclebin a where a.operation = 'DROP' and a.type='TABLE';v_name varchar2(4000);beginopen cur_flashback;fetch cur_flashback into v_name;while cur_flashback%foundloopexecute immediate v_name;fetch cur_flashback into v_name;end loop;dbms_output.put_line('恢复成功!');close cur_flashback;end;end;--执行存储过程(使用plsql操作时)beginRecoveryOfTable;end;--执行存储过程(使用SQL调用)execute RecoveryOfTable;/**************************************批量删除数据库表select * from user_tables where table_name like 'Table_XXX%';存储过程体**************************************/declarecursor cur_delete is select 'drop table '|| table_name from user_tables where table_name like 'Table_XXX%';/*************************************可模板条件删除其它类型对象如:索引等**************************************/v_name varchar2(4000);beginopen cur_delete;fetch cur_delete into v_name;while cur_delete%found loopexecute immediate v_name;fetch cur_delete into v_name;end loop;dbms_output.put_line('将所有Table_XXX开头的表删除!');close cur_delete;end;执行PURGE TABLE ZYM_USER."BIN$UagqFGZsZcvgQAoKpSB9uQ==$0"--oracle todate函数,to_char 函数--oracle 24小时select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual; --12小时select to_date('2005-01-01 2:14:20','yyyy-MM-dd HH12:mi:ss') from dual;select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;--mi是分钟select to_char(sysdate,'yyyy-MM-dd HH12:mi:ss') from dual;--12小时制--选取一个月前的日期select sysdate,sysdate-interval'1'month from dual;--选取一个年前的日期select sysdate,sysdate-interval'1'year from dual;--选取一天前的日期select sysdate,sysdate-interval'1'day from dual;--选取一小时前的日期select sysdate,sysdate-interval'1'hour from dual;--选取7分钟前的日期select sysdate,sysdate-interval'7'minute from dual;--选取时间间隔乘以一个数字的日期select sysdate,sysdate- 5* interval'1'month from dual;select sysdate,sysdate- 5* interval'1'day from dual;select sysdate,sysdate- 5* interval'1'hour from dual;select sysdate,sysdate- 5* interval'1'minute from dual; select sysdate,sysdate - interval'0'month from dual;--当前日期--oracle 获取guidselect sys_guid() from dual ;以24小时的形式显示出来要用HH24select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分钟select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm会显示月份oracle中的to_date参数含义1.日期格式参数含义说明D 一周中的星期几DAY 天的名字,使用空格填充到9个字符DD 月中的第几天DDD 年中的第几天DY 天的简写名IW ISO标准的年中的第几周IYYY ISO标准的四位年份YYYY 四位年份YYY,YY,Y 年份的最后三位,两位,一位HH 小时,按12小时计HH24 小时,按24小时计MI 分SS 秒MM 月Mon 月份的简写Month 月份的全名W 该月的第几个星期WW 年中的第几个星期--日期到字符操作select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual ;--24小时制select sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss') fromdual ;--18:47会变成 06:47select sysdate,to_char(sysdate,'yyyy-ddd hh:mi:ss') from dual ;select sysdate,to_char(sysdate,'yyyy-mm iw-d hh:mi:ss') from dual;--trunk/ ROUND函数的使用select trunc(sysdate ,'YEAR') from dual ;--2014/1/1select trunc(sysdate ) from dual ;--2014/9/28select to_char(trunc(sysdate ,'YYYY'),'YYYY') from dual ;--2014--oracle有毫秒级的数据类型--返回当前时间年月日小时分秒毫秒select to_char(current_timestamp(5),'DD-MON-YYYY HH24:MI:SSxFF') from dual; --28-9月 -2014 18:50:35.64801--返回当前时间的秒毫秒,可以指定秒后面的精度(最大=9)select to_char(current_timestamp(9),'MI:SSxFF') fromdual;--50:35.751743000--oracle 计算程序运行的时间(ms)declaretype rc is ref cursor;l_rc rc;l_dummy all_objects.object_name%type;l_start number default dbms_utility.get_time;beginfor I in1 .. 1000loopopen l_rc for'select object_name from all_objects '||'where object_id = ' || i;fetch l_rc into l_dummy;close l_rc;end loop;dbms_output.put_line( round( (dbms_utility.get_time-l_start)/100, 2 ) || ' seconds...' );end;--对表进行重命名,不能指定所有者名,即不能指定表所属的数据库名称,如ytmat.t_biao_rookie_waybill_userename t_mat_rookie_waybill_use to t_biao_rookie_waybill_use6;--查询Drop操作删除的对象select * from recyclebin ;select count(*) from recyclebin ;使用drop 删除表drop table 表名称恢复:--注:必须9i或10g以上版本支持,flashback无法恢复全文索引flashback table表名称to before drop;。
ORACLE数据库字段类型说明类型含义存储描述备注CHAR固定长度字符串最⼤长度2000bytesVARCHAR2可变长度的字符串,最⼤长度4000bytes可做索引的最⼤长度749 NCHAR根据字符集⽽定的固定长度字符串最⼤长度2000bytesNVARCHAR2根据字符集⽽定的可变长度字符串最⼤长度4000bytesDATE⽇期(⽇-⽉-年)DD-MM-YY(HH-MI-SS),经过严格测试,⽆千⾍问题TIMESTAMP⽇期(⽇-⽉-年)DD-MM-YY(HH-MI-SS:FF3),经过严格测试,⽆千⾍问题与DATE相⽐较,TIMESTAMP有⼩数位秒信息LONG超长字符串最⼤长度2G,⾜够存储⼤部头著作RAW固定长度的⼆进制数据最⼤长度2000bytes可存放多媒体图象声⾳等LONG RAW可变长度的⼆进制数据最⼤长度2G可存放多媒体图象声⾳等BLOB⼆进制数据最⼤长度4GCLOB字符数据最⼤长度4GNCLOB根据字符集⽽定的字符数据最⼤长度4GBFILE存放在数据库外的⼆进制数据最⼤长度4GROWID数据表中记录的唯⼀⾏号10bytes**.*.*格式,*为0或1NROWID⼆进制数据表中记录的唯⼀⾏号最⼤长度4000bytesNUMBER(P,S)数字类型P为整数位,S为⼩数位DECIMAL(P,S)数字类型P为整数位,S为⼩数位INTEGER整数类型⼩的整数FLOAT浮点数类型NUMBER(38),双精度REAL实数类型NUMBER(63),精度更⾼**⽬前Oracle数据库⼤概有26个字段类型,⼤体分为六类,分别是字符串类型、数字数据类型、⽇期时间数据类型、=⼤型对象(LOB)数据类型、RAW和LONG RAW数据类型、ROWID和UROWID数据类型。
**当然Oracle还提供⽤户⾃定义的数据类型,但在我这篇不做讨论。
字符串类型Charchar数据类型存储固定长度的字符值。
⼀个CHAR数据类型可以包括1到2000个字符。
orcal时间类型
Oracle数据库中的时间类型主要有两种:DATE和TIMESTAMP。
1. DATE类型:这是Oracle最常用的日期类型,它可以保存日期和时间。
DATE表示的日期范围是公元前4712年1月1日至公元9999年12月31日。
在数据库中,DATE类型的存储固定为7个字节,格式为:第1字节:世纪+100;第2字节:年;第3字节:月;第4字节:天;第5字节:小时+1;第6字节:分+1;第7字节:秒+1。
2. TIMESTAMP类型:这也是Oracle常用的日期类型,它与DATE的区别在于不仅可以保存日期和时间,还能保存小数秒。
TIMESTAMP类型的小数位数可以指定为0-9,默认为6位,所以最高精度可以到纳秒(ns)。
如果精度为0,则用7字节存储,与DATE类型功能相同;如果精度大于0,则用11字节存储。
to_date()与24小时制表示法及mm分钟的显示:一、在使用Oracle的to_date函数来做日期转换时,很多Java程序员也许会和我一样,直觉的采用“yyyy-MM-dd HH:mm:ss”的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810 格式代码出现两次”。
如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;原因是SQL中不区分大小写,MM和mm被认为是相同的格式代码,所以Oracle的SQL采用了mi代替分钟。
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;二、另要以24小时的形式显示出来要用HH24select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分钟select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm会显示月份to_date() 与 to_char() 日期和字符串转换to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错。
即按照第二个参数的格式解释第一个参数。
to_char(日期,"转换格式" ) 即把给定的日期按照“转换格式”转换。
转换的格式:表示year的:y 表示年的最后一位 yy 表示年的最后2位 yyy 表示年的最后3位 yyyy 用4位数表示年表示month的:mm 用2位数字表示月;mon 用简写形式比如11月或者nov ;month 用全称比如11月或者november表示day的:dd 表示当月第几天;ddd表示当年第几天;dy 当周第几天简写比如星期五或者fri;day当周第几天全写比如星期五或者friday。
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_ZONE2e2)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⽇期时间格式化参数详解格式化⽇期指的是将⽇期转为字符串,或将字符串转为⽇期,下⾯⼏个函数可以⽤来格式化⽇期TO_CHAR(datetime, 'format')TO_DATE(character, 'format')TO_TIMESTAMP(character, 'format')TO_TIMESTAMP_TZ(character, 'format')SQL 产⽣的结果SELECT TO_CHAR(current_timestamp, 'format') FROM DUAL;1Format List itemYYYY-MM-DD2015-06-15YYYY-MON-DD2015-JUN-15YYYY-MM-DD HH24:MI:SS FF32015-06-15 13:18:10 700YYYY-MM-DD HH24:MI:SS FF3 TZR2015-06-15 13:18:10 700 +08:00DS6/15/2015DL Monday, June 15, 2015TS1:18:10 PMOracle ⽀持哪些格式呢?看看下⾯的表格吧Format DescriptionY年的最后⼀位数字,如:5YY年的最后两位数字,如:15YYY年的最后三位数字,如:015YYYY年,如:2015Y,YYY年⽤逗号分割SYYYY年YEAR年拼写,如:TWENTY FIFTEENSYEAR年拼写,如:TWENTY FIFTEENI ISO年的最后⼀位数字,如:5IY ISO年的最后两位数字,如:15IYY ISO年的最后三位数字,如:015IYYY ISO年,如:2015RR两位数字年,如:15RRRR四位数字年,如:2015MM Month (01-12)MON⽉份简称,如:JUNMONTH⽉份全称,如:JUNERM罗马数字⽉份D Day of week (1-7)DD Day of month (1-31)DDD Day of year (1-366)HH Hour of day (1-12)HH12Hour of day (1-12)HH24Hour of day (0-23)MI Minute (0-59)FF [1…9]毫秒DS⽇期简称,如:6/12/2015DL⽇期全称,如:Friday, June 12, 2015TS时间简称,如:5:18:03 PMCC世纪,如:21SCC世纪,如:21Q Quarter of year (1, 2, 3, 4)W Week of month (1-5)WW Week of year (1-53)IW ISO Week of year (1-52 or 1-53)DY星期简称,如:FriDAY星期全称,如:FridayAM A.M.PM P.M.AD A.D.BC B.C.TZD夏令时TZR时区TZH时区之时差TZM时区之分钟差EE era 全称E era 简称J The number of days since January 1, 4712 BCFM去掉⾸尾空格FX精确匹配X秒和毫秒分隔符TH DDTH --> 4thSP DDSP -->FOURSPTH DDSPTH --> FOURTHTHSP DDTHSP --> FOURTH默认情况下,Oracle 格式化⽇期时,有⼀定的容错性,如下⾯的 SQL 返回正确的结果。
Oracle 数据类型及存储方式(三)日期时间类型——袁光东[转]2009年10月18日星期日 16:57第三部分日期时间类型§3.1 DATEDate类型Oralce用于表示日期和时间的数据类型。
固定占用7个字节。
包括七个属性:世纪世纪中的年份月份月份中的哪一天小时分秒SQL> create table test_date(col_date date);Table createdSQL> insert into test_date values(to_date('2008-06-2710:35:00','yyyy-mm-dd hh24:mi:ss'));1 row insertedSQL> select to_char(col_date,'yyyy-mm-dd hh24:mi:ss'),dump(col_date) from test_date;TO_CHAR(COL_DATE,'YYYY-MM-DDHH DUMP(COL_DATE)--------------------------------------------------------------------------------------------------------------2008-06-27 10:35:00 Typ=12 Len=7: 120,108,6,27,11,36,1Date类型的内部编码为12长度:占用7个字节数据存储的每一位到第七位分别为:世纪,年,月,日,时,分,秒。
世纪:采用”加100”表示法来存储。
即世纪+100来存储。
120 – 100 = 20 年:跟世纪一样采用”加100”表示法来存储。
108 – 100 = 08(采用两位表示) 月:自然存储.6日:自然存储,不做修改,27时:(时,分,秒都采用“加1”法存储)11 -1= 10分:36 -1 = 35秒:1 -1 = 0为什么世纪和年份要用加100法存储呢?是为了支持BC和AD日期。
BC即为公元前。
AD即为公元。
如果世纪– 100为一个负数,那么就是一个BC日期。
插入一个公元前日期SQL> insert into test_date values(to_date('-4712-01-01','syyyy-mm-dd hh24:mi:ss'));1 row insertedSQL> select to_char(col_date,'bc yyyy-mm-dd hh24:mi:ss'),dump(col_date) from test_date;TO_CHAR(COL_DATE,'BCYYYY-MM-DD DUMP(COL_DATE)--------------------------------------------------------------------------------------------------------------公元 2008-06-27 10:35:00 Typ=12 Len=7: 120,108,6,27,11,36,1公元前 4712-01-01 00:00:00 Typ=12 Len=7: 53,88,1,1,1,1,1我们已经了解了日期的存储结构。
当要对日期进行截取时,比如去掉时,分,秒。
只需要把最后的三个字节设为:12 12 1就可以了。
SQL> create table test_date1 (col_char varchar2(12), col_date date);Table createdSQL> insert into test_date1 values('full',to_date('2008-06-2712:01:00','yyyy-mm-dd hh24:mi:ss'));1 row insertedSQL> insert into test_date1(col_char,col_date) select 'minute',trunc(col_date,'mi') from test_date12 union all3 select 'day', trunc(col_date,'dd') from test_date14 union all5 select 'month',trunc(col_date,'mm') from test_date16 union all7 select 'year',trunc(col_date,'y') from test_date18 ;4 rows insertedSQL> select col_char, col_date,dump(col_date) from test_date1;COL_CHAR COL_DATE DUMP(COL_DATE)------------ -------------------------------------------------------------------------------------------full 2008-6-27 1 Typ=12 Len=7: 120,108,6,27,13,2,1minute 2008-6-27 1 Typ=12 Len=7: 120,108,6,27,13,2,1day 2008-6-27 Typ=12 Len=7: 120,108,6,27,1,1,1month 2008-6-1 Typ=12 Len=7: 120,108,6,1,1,1,1year 2008-1-1 Typ=12 Len=7: 120,108,1,1,1,1,1要把一个日期截取,只取到年。
数据库只是把最后5个字节置上1。
这是非常快的。
当我们对一个Date字段进行操作,需要截取到年份进行比较时,我们经常使用to_char函数。
通过会这样写。
Select * from test_date1 where to_char(col_date ,’yyyy’) = ‘2008’ 而不是Select * from test_date1 where trunc(col_date,’y’) =to_date(‘2008-01-01’,’yyyy-mm-dd’)使用trunc会占用更少的资源,性能更优。
使用to_char所有的CPU时间与trunc相差一个数量级,差不多10倍。
因为to_char必须把日期转换成一个串,并利用当前系统所采用的NLS来完成,然后执行一个串与串的比较。
而TRUNC只需要把后5个字节设置为1,然后将两个7位的字节的二进行数进行比较就搞定了。
所要截取一个DATE列叶,应该避免使用to_char.另外,要完全避免对DATE列应用函数。
比如我们要查询2008年的所有数据,并且这一列上也有索引,我们希望能够用上这个索引。
SQL> select count(col_date) from test_date1 where col_date >=to_date('2008-01-01','yyyy-mm-dd') and col_date <to_date('2009-01-01','yyyy-mm-dd');COUNT(COL_DATE)---------------5§3.2 向Date类型增加或减时间怎么向Date类型增加时间,例如:向Date增加1天,或1小时,或1秒,一月等。
常有的办法有几个方法:a.向date增加一个NUMBER值。
因为Date 加减操作是以天为单位。
1秒就是1/24/60/60。
依此类推。
b.使用INTERVAL类型。
后续会介绍c.使用内置函数add_months增加月。
增加月不像增加天那么简单,所以需要使用内置函数来处理。
3.2.1 增加秒SQL> create table test_date2(id varchar2(10), operate_time date);Table createdSQL> insert into test_date2 values('1',sysdate);1 row insertedSQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;ID TO_CHAR(OPERATE_TIME,'YYYY-MM----------- ------------------------------1 2008-06-27 13:35:35SQL> update test_date2 set operate_time = operate_time + 1/24/60/60 where id=1;1 row updatedSQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;ID TO_CHAR(OPERATE_TIME,'YYYY-MM----------- ------------------------------1 2008-06-27 13:35:363.2.2 增加分SQL> update test_date2 set operate_time = operate_time + 1/24/60 where id=1;1 row updatedSQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;ID TO_CHAR(OPERATE_TIME,'YYYY-MM----------- ------------------------------1 2008-06-27 13:36:363.2.3 增加小时SQL> update test_date2 set operate_time = operate_time + 1/24 where id=1;1 row updatedSQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;ID TO_CHAR(OPERATE_TIME,'YYYY-MM----------- ------------------------------1 2008-06-27 14:36:363.2.4 增加天SQL> update test_date2 set operate_time = operate_time + 1 where id=1;1 row updatedSQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;ID TO_CHAR(OPERATE_TIME,'YYYY-MM----------- ------------------------------1 2008-06-28 14:36:363.2.4 增加周SQL> update test_date2 set operate_time = operate_time + 1 * 7 where id=1;1 row updatedSQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;ID TO_CHAR(OPERATE_TIME,'YYYY-MM----------- ------------------------------1 2008-07-05 14:36:363.2.5 增加月SQL> update test_date2 set operate_time = add_months(operate_time,1) where id=1;1 row updatedSQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;ID TO_CHAR(OPERATE_TIME,'YYYY-MM----------- ------------------------------1 2008-08-05 14:36:363.2.6 增加年SQL> update test_date2 set operate_time = add_months(operate_time,1 * 12) where id=1;1 row updatedSQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;ID TO_CHAR(OPERATE_TIME,'YYYY-MM----------- ------------------------------1 2009-08-05 14:36:36另外可以使用一个非常有用的函数NUMTODSINTERVAL来新增加小时,分钟,秒。