Oracle时间处理大全

合集下载

oracle date函数用法

oracle date函数用法

oracle date函数用法Oracle DATE函数是用于将一个字符串转换为日期格式的函数。

它有多种用法,以下是其中的几种:1. TO_DATE函数:将字符串转换为日期格式TO_DATE函数的语法如下:TO_DATE(string, format)其中,string是要转换的字符串,format是转换格式,它告诉Oracle如何将字符串转换为日期格式。

例如,如果字符串是'2022-01-01',format应该是'YYYY-MM-DD'。

示例:SELECT TO_DATE('2022-01-01', 'YYYY-MM-DD') FROM DUAL;结果为:01-JAN-222. SYSDATE函数:返回当前日期和时间SYSDATE函数用于获取当前日期和时间。

它没有任何参数。

示例:SELECT SYSDATE FROM DUAL;结果为:21-JUL-21 02.14.45.000000 PM3. ADD_MONTHS函数:将月份加上指定的数量ADD_MONTHS函数用于将一个日期的月份加上指定的数量。

它的语法如下:ADD_MONTHS(date, n)其中,date是要处理的日期,n是要加上的月份数量。

示例:SELECT ADD_MONTHS(TO_DATE('2022-01-01', 'YYYY-MM-DD'), 6) FROM DUAL;结果为:01-JUL-22以上是Oracle DATE函数的常用用法,它们可以帮助您处理日期和时间相关的计算和操作。

oracle数据类型详解---日期型(转载)

oracle数据类型详解---日期型(转载)

oracle数据类型详解---⽇期型(转载)oracle 数据类型详解---⽇期型oracle数据类型看起来⾮常简单,但⽤起来会发现有许多知识点,本⽂是我对ORACLE⽇期数据类型的⼀些整理,都是开发⼊门资料,与⼤家分享:注:由于INTERVAL及TIME ZONE实际⽤得⽐较少,所以本⽂内容未涉及这两个⽅⾯。

1、常⽤⽇期型数据类型1.1、DATE这是ORACLE最常⽤的⽇期类型,它可以保存⽇期和时间,常⽤⽇期处理都可以采⽤这种类型。

DATE表⽰的⽇期范围可以是公元前4712年1⽉1⽇⾄公元9999年12⽉31⽇date类型在数据库中的存储固定为7个字节,格式为:第1字节:世纪+100第2字节:年第3字节:⽉第4字节:天第5字节:⼩时+1第6字节:分+1第7字节:秒+11.2、TIMESTAMP(p)这也是ORACLE常⽤的⽇期类型,它与date的区别是不仅可以保存⽇期和时间,还能保存⼩数秒,⼩数位数可以指定为0-9,默认为6位,所以最⾼精度可以到ns(纳秒),数据库内部⽤7或者11个字节存储,如果精度为0,则⽤7字节存储,与date类型功能相同,如果精度⼤于0则⽤11字节存储。

格式为:第1字节:世纪+100第2字节:年第3字节:⽉第4字节:天第5字节:⼩时+1第6字节:分+1第7字节:秒+1第8-11字节:纳秒,采⽤4个字节存储,内部运算类型为整形注:TIMESTAMP⽇期类型如果与数值进⾏加减运算会⾃动转换为DATE型,也就是说⼩数秒会⾃动去除。

1.3、DATE与TIMESTAMP类型内部存储验证1create table T2 (3 C1 DATE,4 C2 TIMESTAMP(9)5 );67insert into t(c1,c2) values(date'2010-2-12',timestamp'2010-2-12 13:24:52.234123211');8insert into t(c1,c2) values(9 to_date('2010-2-12 10:20:30','YYYY-MM-DD HH24:MI:SS'),10 to_timestamp('2010-2-12 13:24:52.123456','YYYY-MM-DD HH24:MI:SS.FF6')11 );1213 SQL>select c1,dump(c1) c1_d,c2,dump(c2) c2_d from t;C1 C1_D C2 C2_D------------------------ ---------------------------------------- ---------------------------------------- -----------------------------------------------------2010-2-12 Typ=12 Len=7: 120,110,2,12,1,1,1 12-FEB-10 01.24.52.234123211 PM Typ=180 Len=11:120,110,2,12,14,25,53,13,244,111,2032010-2-12 上午 10:20:30 Typ=12 Len=7: 120,110,2,12,11,21,31 12-FEB-10 01.24.52.123456000 PM Typ=180 Len=11:120,110,2,12,14,25,53,7,91,202,0以下是为了测试是为了验证TIMESTAMP的⼩数位存储算法:1 SQL>select c2,dump(c2,16) c2_d16 from t;C2 C2_D16---------------------------------------- --------------------------------------------------------------------------------12-FEB-10 01.24.52.234123211 PM Typ=180 Len=11: 78,6e,2,c,e,19,35,d,f4,6f,cb12-FEB-10 01.24.52.123456000 PM Typ=180 Len=11: 78,6e,2,c,e,19,35,7,5b,ca,0SQL>select to_number('0df46fcb','xxxxxxxx') mydata1,to_number('075bca00','xxxxxxxx') mydata2 from dual;MYDATA1 MYDATA2---------- ----------234123211 1234560002、常见问题2.1、如何取当前时间sysdate--返回当前系统⽇期和时间,精确到秒systimestamp--返回当前系统⽇期和时间,精确到毫秒2.2、如何进⾏⽇期运算⽇期型数据可以与数值加减得到新的⽇期,加减数值单位为天sysdate+1--取明天的当前时间sysdate-1/24--取当前时间的前⼀个⼩时SQL>select sysdate d1,sysdate+1 d2,sysdate-1/24 d3 from dual;D1 D2 D3------------------------ ------------------------ ------------------------2010-5-13 下午 10:55:16 2010-5-14 下午 10:55:16 2010-5-13 下午 09:55:162.3、如何求两个⽇期的间隔时间可以直接把两个⽇期相减,返回的单位为天,⼩时及分秒会换算成⼩数SQL>select date'2012-01-01'-sysdate from dual;DATE'2012-01-01'-SYSDATE------------------------597.0460300925932.4、如何将⽇期转字符to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')2.5、如何将字符转⽇期to_date('2010-02-24 15:01:54','YYYY-MM-DD HH24:MI:SS')to_timestamp('1999-12-01 11:00:00.123456','YYYY-MM-DD HH:MI:SS.FF6')3、常⽤⽇期函数3.1、TO_CHAR(DATE,FORMATSTR)--格式化⽇期成字符SQL>select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') d1 from dual;D1------------------------2010-05-13 22:56:38TO_CHAR的其它⽤法⽰例1 SQL>SELECT TO_CHAR(date '2010-02-12', 'D') week_dayth,--周第⼏天(1-7),星期天=1,星期⼀=2,星期⼆=3,星期三=4,星期四=5,星期五=6,星期六=72 TO_CHAR(date '2010-02-12', 'DD') month_dayth,--⽉第⼏天3 TO_CHAR(date '2010-02-12', 'DDD') year_dayth,--年第⼏天4 TO_CHAR(date '2010-02-12', 'DAY') weekdayname,--英⽂星期名5 _CHAR(date '2010-02-12', 'w') month_weekth,--⽉第⼏周(0-4)6 TO_CHAR(date '2010-02-12', 'ww') year_weekth--年第⼏周(0-53)7FROM DUAL;WEEK_DAYTH MONTH_DAYTH YEAR_DAYTH WEEKDAYNAME MONTH_WEEKTH YEAR_WEEKTH---------- ----------- ---------- ----------- ------------ -----------6 12 043 FRIDAY 2 073.2、TO_DATE(CHAR,FORMATSTR) --将字符转换成⽇期to_date('2010-02-24 15:01:54','YYYY-MM-DD HH24:MI:SS')格式备注:HH表⽰12⼩时进制,HH24表⽰采⽤24⼩时进制,MM表⽰⽉份,MI表⽰分钟。

oracle时间比较函数

oracle时间比较函数

oracle时间比较函数在Oracle数据库中,有很多常用的时间比较函数,它们可以让我们方便地比较不同的时间值,从而实现更加复杂的时间操作。

本文将围绕着Oracle时间比较函数展开讲解,分步骤介绍这些函数的使用方法和注意事项。

1. SYSDATE函数SYSDATE函数是Oracle中最常用的时间比较函数之一,它用于获取系统当前的时间。

在SQL语句中使用SYSDATE函数时不需要为其传递任何参数,只需要直接调用即可。

示例:SELECT sysdate from dual;在执行以上语句后,Oracle数据库会返回一个当前时间类型的值,即当前日期和时间。

2. SYSTIMESTAMP函数SYSTIMESTAMP函数是和SYSDATE非常类似的另一个函数,它也返回当前的日期和时间。

不同之处在于,SYSTIMESTAMP函数返回的是带有时区信息的时间值,可以更准确地表示当前时间。

在SQL语句中使用SYSTIMESTAMP函数时同样不需要传递参数,直接调用即可。

示例:SELECT systimestamp from dual;3. EXTRACT函数EXTRACT函数用于从一个日期或时间类型的值中提取指定的部分,比如提取年份、月份、小时等。

语法如下:EXTRACT (field FROM expression)其中,field可以是以下任意一个值:• YEAR(提取年份)• MONTH(提取月份)• DAY(提取日期)• HOUR(提取小时)• MINUTE(提取分钟)• SECOND(提取秒数)示例:SELECT EXTRACT(YEAR FROM SYSDATE), EXTRACT(MONTH FROM SYSDATE) from dual;该语句会返回当前的年份和月份。

4. ADD_MONTHS函数ADD_MONTHS函数用于在一个日期类型的值上增加指定的月份数。

语法如下:ADD_MONTHS (date, number_of_months)其中,date是指要进行修改的日期,而number_of_months则是要增加的月份数。

oracle数据库时间查询语句

oracle数据库时间查询语句

Oracle数据库是一种强大的关系型数据库管理系统,可用于数据存储和管理。

在开发和维护Oracle数据库时,时间查询是一个非常常见且必要的需求,下文将介绍关于Oracle数据库时间查询的一些常用语句。

一、获取当前日期和时间我们可以使用系统函数SYSDATE获取当前日期和时间,例如:SELECT SYSDATE FROM DUAL;此语句将输出当前日期和时间的值,DUAL是Oracle数据库的一个虚拟表。

二、获取日期时间差针对某一特定时间,获取与当前时间的差值,我们可以使用以下语句:SELECT SYSDATE - hiredate FROM employees WHERE employee_id = 100;此语句将输出雇员100的入职时间与当前时间的差值。

三、日期格式化输出我们可以使用TO_CHAR函数将日期时间以特定的格式进行输出,例如:SELECT TO_CHAR(SYSDATE, 'YY-MM-DD HH24:MI:SS') FROM DUAL;此语句将输出当前日期和时间的值,并按照YY-MM-DD HH24:MI:SS格式进行输出。

四、时间戳查询我们可以使用TIMESTAMP数据类型来查询包含具体时间的记录,例如:SELECT * FROM employee_log WHERE log_time = TIMESTAMP '2022-02-22 08:30:00';此语句将查询employee_log表中记录时间为2022-02-22 08:30:00的记录。

五、时间函数Oracle数据库中还有许多其他有用的时间函数,如ADD_MONTHS、MONTHS_BETWEEN、LAST_DAY等,可用于获取日期的不同部分或计算两个日期之间的差值。

例如:SELECT ADD_MONTHS(SYSDATE, 3) FROM DUAL;此语句将输出当前日期加上3个月的值。

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 dualselect to_date('2004/10/10','yyyy/mm/dd')-to_date('2004/10/01','yyyy/mm/dd') from dual 结果为9selectto_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月-052。

Last_day 本月最后一天SQL> Select last_day(sysdate) from dual;LAST_DAY(S----------30-6月-053。

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月-054。

oracle中to_date详细用法示例(oracle日期格式转换)

oracle中to_date详细用法示例(oracle日期格式转换)

oracle中to_date详细⽤法⽰例(oracle⽇期格式转换)这篇⽂章主要介绍了oracle中to_date详细⽤法⽰例,包括期和字符转换函数⽤法、字符串和时间互转、求某天是星期⼏、两个⽇期间的天数、⽉份差等⽤法TO_DATE格式(以时间:2007-11-02 13:45:25为例)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; //获取时间的⽉select to_char(sysdate,'dd') as nowDay from dual; //获取时间的⽇select to_char(sysdate,'hh24') as nowHour from dual; //获取时间的时select to_char(sysdate,'mi') as nowMinute from dual; //获取时间的分select to_char(sysdate,'ss') as nowSecond from dual; //获取时间的秒2. 字符串和时间互转select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dualselect to_char( to_date(222,'J'),'Jsp') from dual //显⽰Two Hundred Twenty-Two3.求某天是星期⼏select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; //星期⼀select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; // monday//设置⽇期语⾔ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';//也可以这样TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')4. 两个⽇期间的天数select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;5. 时间为null的⽤法select id, active_date from table1UNIONselect 1, TO_DATE(null) from dual; //注意要⽤TO_DATE(null)6.⽉份差a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')//那么12⽉31号中午12点之后和12⽉1号的12点之前是不包含在这个范围之内的。

oracle中to_date详细用法示例(oracle日期格式转换)

oracle中to_date详细⽤法⽰例(oracle⽇期格式转换)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; //获取时间的⽉select to_char(sysdate,'dd') as nowDay from dual; //获取时间的⽇select to_char(sysdate,'hh24') as nowHour from dual; //获取时间的时select to_char(sysdate,'mi') as nowMinute from dual; //获取时间的分select to_char(sysdate,'ss') as nowSecond from dual; //获取时间的秒2. 字符串和时间互转select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dualselect to_char( to_date(222,'J'),'Jsp') from dual //显⽰Two Hundred Twenty-Two3.求某天是星期⼏select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; //星期⼀select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; // monday//设置⽇期语⾔ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';//也可以这样TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')4. 两个⽇期间的天数select floor(sysdate - to_date('20020405','yyyymmdd')) from dual5. 时间为null的⽤法select id, active_date from table1UNIONselect 1, TO_DATE(null) from dual; //注意要⽤TO_DATE(null)6.⽉份差a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')//那么12⽉31号中午12点之后和12⽉1号的12点之前是不包含在这个范围之内的。

oracle中时间格式的转换

oracle中时间格式的转换1:取得当前⽇期是本⽉的第⼏周select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual;TO_CHAR(SYSDATE,'YY')select to_char(sysdate,'W') from dual;2:取得当前⽇期是⼀个星期中的第⼏天,注意星期⽇是第⼀天select sysdate,to_char(sysdate,'D') from dual; 类似:select to_char(sysdate,'yyyy') from dual; --年select to_char(sysdate,'Q' from dual; --季select to_char(sysdate,'mm') from dual; --⽉select to_char(sysdate,'dd') from dual; --⽇ddd 年中的第⼏天WW 年中的第⼏个星期W 该⽉中第⼏个星期D 周中的星期⼏hh ⼩时(12)hh24 ⼩时(24)Mi 分ss 秒3:取当前⽇期是星期⼏中⽂显⽰:select to_char(sysdate,'day') from dual;TO_CHAR(SYSDATE,'DAY')星期四4:如果⼀个表在⼀个date类型的字段上⾯建⽴了索引,如何使⽤alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'5: 得到当前的⽇期select sysdate from dual;6: 得到当天凌晨0点0分0秒的⽇期select trunc(sysdate) from dual;-- 得到这天的最后⼀秒select trunc(sysdate) + 0.99999 from dual;-- 得到⼩时的具体数值select trunc(sysdate) + 1/24 from dual;select trunc(sysdate) + 7/24 from dual;7.得到明天凌晨0点0分0秒的⽇期select trunc(sysdate+1) from dual;select trunc(sysdate)+1 from dual;8: 本⽉⼀⽇的⽇期select trunc(sysdate,'mm') from dual;9:得到下⽉⼀⽇的⽇期select trunc(add_months(sysdate,1),'mm') from dual;10:返回当前⽉的最后⼀天?select last_day(sysdate) from dual;select last_day(trunc(sysdate)) from dual;select trunc(last_day(sysdate)) from dual;select trunc(add_months(sysdate,1),'mm') - 1 from dual;11: 得到⼀年的每⼀天select trunc(sysdate,'yyyy')+ rn -1 date0from(select rownum rn from all_objectswhere rownum<366);12:今天是今年的第N天SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;13:如何在给现有的⽇期加上2年select add_months(sysdate,24) from dual;14:判断某⼀⽇⼦所在年分是否为润年select decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','闰年','平年') from dual;15:判断两年后是否为润年select decode(to_char(last_day(trunc(add_months(sysdate,24),'y')+31),'dd'),'29','闰年','平年') from dual;16:得到⽇期的季度select ceil(to_number(to_char(sysdate,'mm'))/3) from dual;select to_char(sysdate, 'Q') from dual;TO_DATE格式(以时间:2007-11-02 13:45:25为例)Year:yy two digits 两位年显⽰值:07yyy three digits 三位年显⽰值:007yyyy four digits 四位年显⽰值:2007Month:mm number 两位⽉显⽰值:11mon abbreviated 字符集表⽰显⽰值:11⽉,若是英⽂版,显⽰novmonth spelled out 字符集表⽰显⽰值:11⽉,若是英⽂版,显⽰novemberDay:dd number 当⽉第⼏天显⽰值:02ddd number 当年第⼏天显⽰值:02dy abbreviated 当周第⼏天简写显⽰值:星期五,若是英⽂版,显⽰friday spelled out 当周第⼏天全写显⽰值:星期五,若是英⽂版,显⽰fridayddspth spelled out, ordinal twelfthHour:hh two digits 12⼩时进制显⽰值:01hh24 two digits 24⼩时进制显⽰值:13Minute:mi two digits 60进制显⽰值:45Second:ss two digits 60进制显⽰值:25其它Q digit 季度显⽰值:4WW digit 当年第⼏周显⽰值:44W digit 当⽉第⼏周显⽰值:124⼩时格式下时间范围为: 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; //获取时间的⽉select to_char(sysdate,'dd') as nowDay from dual; //获取时间的⽇select to_char(sysdate,'hh24') as nowHour from dual; //获取时间的时select to_char(sysdate,'mi') as nowMinute from dual; //获取时间的分select to_char(sysdate,'ss') as nowSecond from dual; //获取时间的秒select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual//2.select to_char( to_date(222,'J'),'Jsp') from dual显⽰Two Hundred Twenty-Two3.求某天是星期⼏select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;星期⼀select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;monday设置⽇期语⾔ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';也可以这样TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')4. 两个⽇期间的天数select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;5. 时间为null的⽤法select id, active_date from table1UNIONselect 1, TO_DATE(null) from dual;注意要⽤TO_DATE(null)6.⽉份差a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')那么12⽉31号中午12点之后和12⽉1号的12点之前是不包含在这个范围之内的。

oracle常用函数trunc用法

oracle常用函数trunc用法Oracle中的TRUNC函数有多种用法,它主要用于截取日期、数值和字符串类型的数据。

下面将介绍常用的几种TRUNC函数的用法。

1.日期截取:TRUNC函数可以从一个日期表达式中截取出指定的部分,如年、月、日、小时、分钟等。

- TRUNC(date, 'YEAR'):截取日期表达式的年份部分,将月、日、时、分和秒均截取掉,返回结果为该年的1月1日的日期。

例如:SELECT TRUNC(SYSDATE, 'YEAR') FROM DUAL;- TRUNC(date, 'MONTH'):截取日期表达式的月份部分,将日、时、分和秒截取掉,返回结果为该月的1日的日期。

例如:SELECTTRUNC(SYSDATE, 'MONTH') FROM DUAL;- TRUNC(date, 'DD'):截取日期表达式的日部分,将时、分和秒截取掉,返回结果为当天的日期。

例如:SELECT TRUNC(SYSDATE, 'DD') FROM DUAL;2.数值截取:TRUNC函数可以截取出数值的整数部分或指定的小数位数,并将小数部分舍去。

- TRUNC(number):截取出数值的整数部分,例如:SELECTTRUNC(3.14) FROM DUAL; -- 结果为3;3.字符串截取:TRUNC函数还可以用于截取字符串的指定长度。

- TRUNC(string, n):截取字符串的前n个字符。

例如:SELECT TRUNC('Hello world', 5) FROM DUAL; -- 结果为'Hello';以上是TRUNC函数的一些常用用法,下面再介绍一些更高级的用法:4.日期计算:TRUNC函数可以与其他日期函数结合使用,实现日期的计算。

- TRUNC(date, 'YYYY') + 1:计算出下一年的1月1日的日期。

oracle中trunc用法

oracle中trunc用法
Oracle中的trunc函数是用于对数值进行截取操作的函数,其主要用法如下:
1. 对日期进行截取
TRUNC函数可以对日期进行截取操作,将日期的时分秒都清零,只保留年月日的部分。

使用方法如下:
TRUNC(date, 'fmt')
其中,date是待截取的日期,fmt是格式化字符串,可以指定截取的精度。

常用的格式化字符串如下:
格式化字符串 | 截取精度
--- | ---
'YYYY' | 年
'MM' | 月
'DD' | 日
'HH' | 小时
'MI' | 分钟
'SS' | 秒
例如,TRUNC(SYSDATE, 'MM')将返回当前月份的第一天,即将当前日期的日部分清零。

2. 对数值进行截取
TRUNC函数还可以对数值进行截取操作,将小数部分舍去,只保留整数部分。

使用方法如下:
TRUNC(number, [precision])
其中,number是待截取的数值,precision是保留的小数位数,默认为0。

例如,TRUNC(3.14159)将返回3,TRUNC(3.14159, 2)将返回3.14。

总之,TRUNC函数是Oracle中一个非常实用的函数,可以对日期和数值进行灵活的截取操作,方便用户进行数据处理和计算。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SQL Server和Oracle常用时间日期处理语句在SQL语句中,常常用会对时间(或日期)进行一些处理,下面是比较通用的一些语句:延迟:view plainc opy to clipboardprint?1.sysdate+(5/24/60/60) 在系统时间基础上延迟5秒2.3.sysdate+5/24/60 在系统时间基础上延迟5分钟4.5.sysdate+5/24 在系统时间基础上延迟5小时6.7.sysdate+5 在系统时间基础上延迟5天8.9.add_months(sysdate,-5) 在系统时间基础上延迟5月10.11.add_months(sysdate,-5*12) 在系统时间基础上延迟5年上月末的日期:view plainc opy to clipboardprint?1.select last_day(add_months(sysdate, -1)) from dual;本月的最后一秒:view plainc opy to clipboardprint?1.select trunc(add_months(sysdate,1),'MM') - 1/24/60/60 from dual本周星期一的日期:view plainc opy to clipboardprint?1.select trunc(sysdate,'day')+1 from dual年初至今的天数:view plainc opy to clipboardprint?1.select ceil(sysdate - trunc(sysdate, 'year')) from dual;今天是今年的第几周 :view plainc opy to clipboardprint?1.select to_char(sysdate,'fmww') from dual今天是本月的第几周:view plainc opy to clipboardprint?1.SELECT TO_CHAR(SYSDATE,'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1 AS"weekOfMon"FROM dual本月的天数view plainc opy to clipboardprint?1.SELECT to_char(last_day(SYSDATE),'dd') days FROM dual今年的天数view plainc opy to clipboardprint?1.select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 下个星期一的日期view plainc opy to clipboardprint?1.SELECT Next_day(trunc(SYSDATE),'monday') FROM dual================================计算工作日方法view plainc opy to clipboardprint?1.create table t(s date,e date);2.3.alter session set nls_date_format = 'yyyy-mm-dd';4.5.insert into t values('2003-03-01','2003-03-03');6.7.insert into t values('2003-03-02','2003-03-03');8.9.insert into t values('2003-03-07','2003-03-08');10.11.insert into t values('2003-03-07','2003-03-09');12.13.insert into t values('2003-03-05','2003-03-07');14.15.insert into t values('2003-02-01','2003-03-31');16.17.-- 这里假定日期都是不带时间的,否则在所有日期前加trunc即可.18.19.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)),'0','')) work_days from t;20.21.-- drop table t;====================================================判断当前时间是上午下午还是晚上view plainc opy to clipboardprint?1.SELECT CASE2.WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 6 AND 11 THEN'上午'3.4.WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 11 AND 17 THEN'下午'5.6.WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 17 AND 21 THEN'晚上'7.8.END9.10.FROM dual;===================================================Oracle 中的一些处理日期将数字转换为任意时间格式.如秒:需要转换为天/小时view plainc opy to clipboardprint?1.SELECT to_char(floor(TRUNC(936000/(60*60))/24))||'天'||to_char(mod(TRUNC(936000/(60*60)),24))||'小时'FROM DUALTO_DATE格式view plainc opy to clipboardprint?1.Day:2.3.dd number 124.5.dy abbreviated fri6.7.day spelled out friday8.9.ddspth spelled out, ordinal twelfth10.11.Month:12.13.mm number 0314.15.mon abbreviated mar16.17.month spelled out march18.19.Year:20.21.yy two digits 9822.23.yyyy four digits 199824小时格式下时间范围为: 0:00:00 – 23:59:59….12小时格式下时间范围为: 1:00:00 – 12:59:59 ….1. 日期和字符转换函数用法(to_date,to_char)2.view plainc opy to clipboardprint?1.select to_char( to_date(222,'J'),'Jsp') from dual显示Two Hundred Twenty-Two3. 求某天是星期几view plainc opy to clipboardprint?1.select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;2.3.select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE =American') from dual;设置日期语言view plainc opy to clipboardprint?1.ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';也可以这样view plainc opy to clipboardprint?1.TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')4. 两个日期间的天数view plainc opy to clipboardprint?1.select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;5. 时间为null的用法view plainc opy to clipboardprint?1.select id, active_date from table12.UNION3.select 1, TO_DATE(null) from dual;注意要用TO_DATE(null)6.view plainc opy to clipboardprint?1.a_date between to_date('20011201','yyyymmdd') andto_date('20011231','yyyymmdd')那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的.所以,当时间需要精确的时候,觉得to_char还是必要的7. 日期格式冲突问题输入的格式要看你安装的ORACLE字符集的类型, 比如:US7ASCII, date格式的类型就是: ’01-Jan-01′view plainc opy to clipboardprint?1.alter system set NLS_DATE_LANGUAGE = American2.3.alter session set NLS_DATE_LANGUAGE = American或者在to_date中写view plainc opy to clipboardprint?1.select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE =American') from dual;注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 可查看view plainc opy to clipboardprint?1.select * from nls_session_parameters2.select * from V$NLS_PARAMETERS8.view plainc opy to clipboardprint?1.select count(*)2.from ( select rownum-1 rnum3.from all_objects4.where rownum <= to_date('2002-02-28','yyyy-mm-dd') -to_date('2002-02-01','yyyy-mm-dd')+1 )5.where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )6.not in ( '1', '7' )查找2002-02-28至2002-02-01间除星期一和七的天数在前后分别调用DBMS_UTILITY.GET_TIME, 然后将结果相减(得到的是1/100秒, 而不是毫秒).9.view plainc opy to clipboardprint?1.select months_between(to_date('01-31-1999','MM-DD-YYYY'),2.to_date('12-31-1998','MM-DD-YYYY')) "MONTHS"FROM DUAL;3. 14.select months_between(to_date('02-01-1999','MM-DD-YYYY'),5.to_date('12-31-1998','MM-DD-YYYY')) "MONTHS"FROM DUAL;6. 1.0322580645161310. Next_day的用法view plainc opy to clipboardprint?1.Next_day(date, day)2.3.Monday-Sunday, for format code DAY4.Mon-Sun, for format code DY5.1-7, for format code D11view plainc opy to clipboardprint?1.select to_char(sysdate,'hh:mi:ss') TIME from all_objects注意:第一条记录的TIME 与最后一行是一样的可以建立一个函数来处理这个问题view plainc opy to clipboardprint?1.create or replace function sys_date return date is2.begin3.return sysdate;4.end;5.select to_char(sys_date,'hh:mi:ss') from all_objects;12. 获得小时数view plainc opy to clipboardprint?1.SQL> select sysdate ,to_char(sysdate,'hh') from dual;2.SYSDATE TO_CHAR(SYSDATE,'HH')——————–———————2003-10-13 19:35:21 07view plainc opy to clipboardprint?1.SQL> select sysdate ,to_char(sysdate,'hh24') from dual;2.3.SYSDATE TO_CHAR(SYSDATE,'HH24')——————–———————–2003-10-13 19:35:21 19获取年月日与此类似13. 年月日的处理view plainc opy to clipboardprint?1.select older_date,2.newer_date,3.years,4.months,5.6.abs( trunc( newer_date-add_months( older_date,years*12+months ) ) days from( select trunc(months_between( newer_date, older_date )/12) YEARS,mod(trunc(months_between( newer_date, older_date )),12 ) MONTHS,view plainc opy to clipboardprint?1.newer_date,2.older_date3.from ( select hiredate older_date,4.add_months(hiredate,rownum)+rownum newer_date from emp ) )14. 处理月份天数不定的办法view plainc opy to clipboardprint?1.select to_char(add_months(last_day(sysdate) +1, -2),'yyyymmdd'),last_day(sysdate) from dual16. 找出今年的天数view plainc opy to clipboardprint?1.select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 闰年的处理方法view plainc opy to clipboardprint?1.to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' )如果是28就不是闰年17. yyyy与rrrr的区别‘YYYY99 TO_C——- —-yyyy 99 0099rrrr 99 1999yyyy 01 0001rrrr 01 200118.不同时区的处理view plainc opy to clipboardprint?1.select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate2.from dual;19. 5秒钟一个间隔view plainc opy to clipboardprint?1.Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) *300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')2.from dualTO_DATE(FL TO_CH———- —–2007-01-01 60368SSSSS表示5位秒数20. 一年的第几天view plainc opy to clipboardprint?1.select TO_CHAR(SYSDATE,'DDD'),sysdate from dualTO_ SYSDATE————-017 2007-01-1721.计算小时,分,秒,毫秒view plainc opy to clipboardprint?1.select2.Days,3.A,4.TRUNC(A*24) Hours,5.TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,6.TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,7.TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds8.from9.( select trunc(sysdate) Days, sysdate - trunc(sysdate) A10.from dual11.)12.13.select * from tabname14.order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');15.16.//17.18.floor((date2-date1) /365) 作为年19.floor((date2-date1, 365) /30) 作为月20.mod(mod(date2-date1, 365), 30) 作为日.22.next_day函数next_day(sysdate,6)是从当前开始下一个星期五.后面的数字是从星期日开始算起.1 2 3 4 5 6 7日一二三四五六—————————————————————view plainc opy to clipboardprint?1.select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-ddhh24:mi:ss'))*24*60*60 from dual日期返回的是天然后转换为ss。

相关文档
最新文档