Oracle中的Round和Trunc

一、Oracle中的Round和Trunc:

如同对数字进行四舍五入和按位截取一样,Oracle对时间日期也提供了这两种功能。但比起对数字进行四舍五入和截取比较复杂:这是因为时间日期是有格式的。下面看看这两个函数的定义和用途:

ROUND(date [, format])

TRUNC(date [, format])

Round函数对日期进行“四舍五入”,Trunc函数对日期进行截取。如果我们不指定格式的话,Round会返回一个最接近date参数的日期,而Trunc函数只会简单的截取时分秒部分,返回年月日部分。

二、Round和Trunc函数示例:

SQL >   select  to_char(sysdate,  ' yyyy-mm-dd hh24:mi:ss ' ) now_date,
   2              to_char( Round (sysdate), ' yyyy-mm-dd hh24:mi:ss '
) round_date,
   3              to_char(Trunc(sysdate), ' yyyy-mm-dd hh24:mi:ss '
) trunc_date
   4      from
 dual;

NOW_DATE                               ROUND_DATE                             TRUNC_DATE
-- ------------------------------------ -------------------------------------- ----------------------

2008 - 06 - 30   14 : 52 : 13                      2008 - 07 - 01   00 : 00 : 00                      2008 - 06 - 30   00 : 00 : 00


这是一个典型的例子,由于我们没有指定round和trunc函数的格式,所以Oracle默认采用了按日期时间的格式,该例子中当前的时间是下午 14:52分,已经超过了12:00 AM这个中界线,所以Round返回07-01日而非06-30日。而Trunc不管三七二十一直接截取前面日期部分返回。

另外一个值得注意的地方是这两个函数返回的时分秒都是00:00:00,即一天的开始时间(对于12小时制的返回的是12:00:00 AM)。

三、指定格式的Round和Trunc函数示例:

如果我们对Round函数和Trunc函数指定了格式,事情就变得有点复杂了,不过核心思想还是不变:Round是四舍五入,Trunc是截取。举个例子来说,假如我们以年为格式,则现在Oracle的判断是基于年来判断,超过一年的一半(即6月30日),Round函数则返回下一年了,Trunc函数依然返回当前年。

SQL >   select  sysdate "Now date",
   2              Round (sysdate,  ' yyyy '
) Round_year,
   3              Trunc(sysdate,  ' yyyy '
) Trunc_year
   4      from
 dual;

Now date   ROUND_YEAR TRUNC_YEAR
-- -------- ---------- ----------

30 - 6月  - 08   01 - 1月  - 08   01 - 1月  - 08


关于这两个函数可用的格式非常多,但日常应用中用得比较多的基本上就这几个,以Round函数为例:

select   Round (sysdate,  ' Q ' ) Rnd_Q,
         Round (sysdate,  ' Month '
) Rnd_Month,
         Round (sysdate,  ' WW '
) Rnd_Week,
         Round (sysdate,  ' W '
) Rnd_Week_again,
         Round (sysdate,  ' DDD '
) Rnd_day,
         Round (sysdate,  ' DD '
) Rnd_day_again,
         Round (sysdate,  ' DAY '
) Rnd_day_of_week,
         Round (sysdate,  ' D '
) Rnd_day_of_week_again,
         Round (sysdate,  ' HH12 '
) Rnd_hour_12,
         Round (sysdate,  ' HH24 '
) Rnd_hour_24,
         Round (sysdate,  ' MI '
) Rnd_minute
   from  dual

 

 

四、用trunc函数处理日期

 日期用例 '2008-11-28 12:59:59'周五  

1.没有fmt部分时

   语句: SELECT   TRUNC(TO_DATE('2008-11-28 12:00:01','YYYY-MM-DD hh24:mi:ss')) FROM   DUAL;
          结果: 2008-11-28  

        

2.得到最当前日期之前的最近的一个周日的日期

   语句: SELECT   TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'D') FROM   DUAL;   
   结果: 2008-11-23 周日

   语句: SELECT   TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'D')+1 FROM   DUAL;   
   结果: 2008-11-24 周一

 

3.得到最当前日期的所在月份的第一天

   语句: SELECT   TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'MM') FROM   DUAL;   
   结果: 2008-11-1

   语句: SELECT   TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'MM')-1 FROM   DUAL; 

   结果: 2008-10-31

 

4.得到最当前日期的所在年份的第一天

   语句: SELECT   TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'Y') FROM   DUAL;   
   结果: 2008-1-1

   语句: SELECT   TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'Y')-1 FROM   DUAL; 

   结果: 2007-12-31

转载于:https://www.cnblogs.com/xhk1228/archive/2013/04/11/3194877.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【超详细教程】使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结...

去年就知道有这个功能,不过没去深究总结过,最近有写网络博客的欲望了,于是又重新拾起这玩意儿。 具体到底是用Windows Live Writer 2012还是用Word 2013,个人觉得看个人,因为这2个软件各有优点,各有缺点。 …

多态(继承父类的非静态重写方法)

/* 1.多态:程序中研究对象的多态 2.People p new Person();转换为父类 变量 new 子类(); 3.意义:单继承下,可以无限扩展,满足扩展性 4.前提:必须有继承方法…

xml语法基础

1.xml直观样式 XML是最理想的树状数据结构的存储方式。 <?xml version"1.0" encoding"ISO-8859-1"?> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Dont forget…

spring map使用annotation泛型注入问题分析

今天在整一个spring的ioc学习demo&#xff0c;碰到一个问题&#xff0c;居然Autowire在set方法注入map时&#xff0c;map的key类型不能为String之外的其他类型&#xff0c;具体看下面问题 Autowiredpublic void setTypeMap(Map<Integer,String> typeMap) {this.typeMap …

(JAVA)Object类之toString()和equals()

Object类&#xff1a;存储于java.lang包中&#xff0c;有构造方法&#xff0c;无super 一.toString():返回该对象的字符串表示-----String类型&#xff0c;输出类型中&#xff0c;默认调用toString()1.public String toString() {return getClass().getName() "" I…

(JAVA)Object类之Scanner

/* Scanner类&#xff1a;使用正则表达式解析基本类型和字符串的简单文本扫描器 一.源代码&#xff1a;public final class Scanner implements Iterator<String>, Closeable {...}1.不允许继承2.使用时必须导入包 import java.util.Scanner&#xff1b; jdk1.5以上版本才…

序列化 小复习

想要序列化一个对象则需要使其继承serializable或者externalizable接口 一下是一个实例小程序&#xff1a; ser_test 1 import java.io.*;2 3 public class ser_test{4 public static void main(String[] args) throws Exception{5 person p1 new person(1,1.2,&q…

(JAVA)Object类之String类

/* 字符串&#xff1a; 一、概述&#xff1a;1.字符串在JAVA中&#xff0c;使用""表示2.java.lang.String类3.只要写""就是字符串对象。不需要new二、空参构造器new Sting();private final char value[];public String() {this.value "".value;…

(JAVA)String类之比较方法

/* 字符串&#xff1a; 一、概述&#xff1a;1.字符串在JAVA中&#xff0c;使用""表示2.java.lang.String类3.只要写""就是字符串对象。不需要new二、空参构造器new Sting();private final char value[];public String() {this.value "".value;…