关闭

浅议Oracle的日期与时间

标签: oracledate2010数据库oracle10gsession
643人阅读 评论(0) 收藏 举报

1.获得今天的日期.

SQL> select sysdate from dual;

SYSDATE
---------
24-JAN-11

2.在世界上活了多少天,假设生日是1945年12月12日

SQL> select to_date(sysdate)-to_date('12-dec-1945') from dual;

TO_DATE(SYSDATE)-TO_DATE('12-DEC-1945')
---------------------------------------
                                  23784

恭喜,活了2万多天.

3.两个日期间的天数.假设计算2009年12月15日2011年1月31日

SQL> select to_date('31-jan-2011')-to_date('15-dec-2009') from dual;

TO_DATE('31-JAN-2011')-TO_DATE('15-DEC-2009')
---------------------------------------------
                                          412

4.某项统计的日期范围是2010年3季度的,即2010年7月1日到2010年8月31日.一般有两种写法.

写法一:

select count(rowid) from table_name where trunc(table_date_time) between '1-jul-2010' and '31-aug-2010';

写法二:

select count(rowid) from table_name where table_date_time between '1-jul-2010' and '1-sep-2010';

    可以看到,这两种写法是等效的.为什么会等效呢?因为Oracle存储date格式(日期和时间)时,除了年月日外,当然还存储有时分秒.在这里的SQL语句里,我们给予的日期时间都没有明确指定时间,Oracle就默认是0时0分0秒.写法二里,我们传递的日期范围其实是2010年7月1日0时0分0秒到2010年9月1日0时0分0秒.所以正好8月31日当天的数据会包含在统计里,而9月1日当天所有时间都是大于2010年9月1日0时0分0秒的,所以不会包含在里面.但这里有一个问题,between操作符是包含边界的,这是一个闭区间,所以有时碰到极端情况,会把2010年9月1日0时0分0秒的数据包含进来,所以推荐第一种写法.

    再来看写法一.trunc函数的原型是trunc(x,unit),用于对x进行截断.默认情况下,x被截断为当天的开始时间.所以,字段table_date_time本来是还存储了时间的,但是被trunc函数截断成0时0分0秒了.后面,你懂的...

5.把某个时间点前的数据纠出来.比如要查出2010年8月1日13:45:54前的某个数据,Oracle的时间函数参数众多,这可不是个好差事.

select count(rowid) from table_name where to_char(table_date_time,'YYYY-MM-DD HH24:MI:SS')<'2010-08-01 13:45:54';

    我承认,中间那一堆参数,YYYY-MM-DD等等,真的很折腾人,记了好久才记住.

6.设置默认的日期格式

    默认的日期格式是在数据库参数NLS_DATE_FORMAT中指定的.DBA可以修改NLS_DATE_FORMAT的设置,方法是在数据库的init.ora或spfile.ora(数据库启动时会读取这个文件的内容)文件中设置这个参数的值.DBA还可以使用alter system命令设置NLS_DATE_FORMAT的值.

    普通用户也可以使用alter session为自己的会话设置NLS_DATE_FORMAT参数.在sql*plus或者自己设计的应用程序里,需要临时改变一下日期时间的格式时可以使用.注意:会话是从成功建立与数据库的连接开始,到断开与数据库的连接结束.例如:

SQL> alter session set nls_date_format='MONTH-DD-YYYY';

Session altered.

SQL> select sysdate from dual;

SYSDATE
-----------------
JANUARY  -24-2011

可以看到结果与第1点获得今天的日期的格式不一样了.

    Oracle10G还支持日期和时间戳,但目前在平时应用中关于时间的处理,最常用的就这些.Oracle的日期和时间还有很多参数,可以用于to_char和to_date函数.YYYY,MONTH等只是其中的一些.需要的可以参考其他相关资料,寻找这些令人头疼的日期与时间参数.

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:67270次
    • 积分:100
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:23条
    文章分类
    最新评论