文档章节

Oracle date 和 timestamp 区别

 小鱼吃大鱼
发布于 2016/06/24 11:34
字数 1838
阅读 11
收藏 0
点赞 0
评论 0

转发http://www.cnblogs.com/java-class/p/4742740.html#_labelTop

Oracle date 和 timestamp 区别

阅读目录

回到顶部

1.DATE数据类型

     这个数据类型我们实在是太熟悉了,当我们需要表示日期和时间的话都会想到date类型。它可以存储月,年,日,世纪,时,分和秒。它典型地用来表示什么时候事情已经发生或将要发生。
     DATE数据类型的问题在于它表示两个事件发生时间间隔的度量粒度是秒。这个问题将在稍后讨论timestamp的时候被解决。可以使用TO_CHAR函数把DATE数据进行传统地包装,达到表示成多种格式的目的。

复制代码

1 SQL> SELECT TO_CHAR(date1,'MM/DD/YYYY HH24:MI:SS') "Date" FROM date_table;
2 
3 Date 
4 --------------------------- 
5 06/20/2003 16:55:14 
6 06/26/2003 11:16:36

复制代码

   大多数人陷入的麻烦就是计算两个时间间的间隔年数、月数、天数、小时数和秒数。你需要明白的是,当你进行两个日期的相减运算的时候,得到的是天数。你需要乘上每天的秒数(1天=86400秒),然后,你可以再次计算得到你想要的间隔数。下面就是我的解决方法,可以精确计算出两个时间的间隔。我明白这个例子可以更简短些,但是我是为了显示所有的数字来强调计算方式。

复制代码

 1 SELECT TO_CHAR(date1, 'MMDDYYYY:HH24:MI:SS') date1,
 2        TO_CHAR(date2, 'MMDDYYYY:HH24:MI:SS') date2,
 3        trunc(86400 * (date2 - date1)) -
 4        60 * (trunc((86400 * (date2 - date1)) / 60)) seconds,
 5        trunc((86400 * (date2 - date1)) / 60) -
 6        60 * (trunc(((86400 * (date2 - date1)) / 60) / 60)) minutes,
 7        trunc(((86400 * (date2 - date1)) / 60) / 60) -
 8        24 * (trunc((((86400 * (date2 - date1)) / 60) / 60) / 24)) hours,
 9        trunc((((86400 * (date2 - date1)) / 60) / 60) / 24) days,
10        trunc(((((86400 * (date2 - date1)) / 60) / 60) / 24) / 7) weeks
11   FROM date_table
12 
13 DATE1 DATE2 SECONDS MINUTES HOURS DAYS WEEKS 
14 ----------------- ----------------- ---------- ---------- ---------- ---------- ---------- 
15 06202003:16:55:14 07082003:11:22:57 43 27 18 17 2 
16 06262003:11:16:36 07082003:11:22:57 21 6 0 12 1

复制代码

回到顶部

2.TIMESTAMP 数据类型

    DATE数据类型的主要问题是它粒度不能足够区别出两个事件哪个先发生。ORACLE已经在DATE数据类型上扩展出来了TIMESTAMP数据类型,它 包括了所有DATE数据类型的年月日时分秒的信息,而且包括了小数秒的信息。如果你想把   DATE类型转换成TIMESTAMP类型,就使用CAST函数。

1 SQL> SELECT CAST(date1 AS TIMESTAMP) "Date" FROM t; 
2 Date 
3 ----------------------------------------------------- 
4 20-JUN-03 04.55.14.000000 PM 
5 26-JUN-03 11.16.36.000000 AM

     正如你看到的,在转换后的时间段尾部有了一段“.000000”。这是因为从date转换过来的时候,没有小数秒的信息,缺省为0。而且显示格式是按照 参数NLS_TIMESTAMP_FORMAT定的缺省格式显示。当你把一个表中date类型字段的数据移到另一个表的timestamp类型字段中去的 时候,可以直接写INSERT SELECT语句,oracle会自动为你做转换的。

1 SELECT TO_CHAR(time1,'MM/DD/YYYY HH24:MI:SS') "Date" FROM date_table 
2 Date 
3 ------------------- 
4 06/20/2003 16:55:14 
5 06/26/2003 11:16:36

    TIMESTAMP数据的格式化显示和DATE 数据一样。注意,to_char函数支持date和timestamp,但是trunc却不支持TIMESTAMP数据类型。这已经清楚表明了在当两个时 间的差别极度重要的情况下,使用TIMESTAMP数据类型要比DATE数据类型更确切。

复制代码

1 SELECT TO_CHAR(time1,'MM/DD/YYYY HH24:MI:SS:FF3') "Date" FROM date_table
2 
3 Date 
4 ----------------------- 
5 06/20/2003 16:55:14:000 
6 06/26/2003 11:16:36:000

复制代码

     计算timestamp间的数据差别要比老的date数据类型更容易。当你直接相减的话,看看会发生什么。结果将更容易理解,第一行的17天,18小时,27分钟和43秒。

复制代码

 1 SELECT time1,
 2        time2,
 3        substr((time2 - time1), instr((time2 - time1), ' ') + 7, 2) seconds,
 4        substr((time2 - time1), instr((time2 - time1), ' ') + 4, 2) minutes,
 5        substr((time2 - time1), instr((time2 - time1), ' ') + 1, 2) hours,
 6        trunc(to_number(substr((time2 - time1), 1, instr(time2 - time1, ' ')))) days,
 7        trunc(to_number(substr((time2 - time1), 1, instr(time2 - time1, ' '))) / 7) weeks
 8   FROM date_table
 9   
10 TIME1 TIME2 SECONDS MINUTES HOURS DAYS WEEKS 
11 ------------------------- -------------------------- ------- ------- ----- ---- ----- 
12 06/20/2003:16:55:14:000000 07/08/2003:11:22:57:000000 43 27 18 17 2 
13 06/26/2003:11:16:36:000000 07/08/2003:11:22:57:000000 21 06 00 12 1 

复制代码

     这就意味着不再需要关心一天有多少秒在麻烦的计算中。因此,得到天数、月数、天数、时数、分钟数和秒数就成为用substr函数摘取出数字的事情了。

回到顶部

3.系统日期和时间

     为了得到系统时间,返回成date数据类型。你可以使用sysdate函数。

1 SQL> SELECT SYSDATE FROM DUAL;

     为了得到系统时间,返回成timestamp数据类型。你可以使用systimpstamp函数。

1 SQL> SELECT SYSTIMESTAMP FROM DUAL;

     你可以设置初始化参数FIXED_DATE指定sysdate函数返回一个固定值。这用在测试日期和时间敏感的代码。注意,这个参数对于systimestamp函数无效。

复制代码

 1 SQL> ALTER SYSTEM SET fixed_date = '2003-01-01-10:00:00'; 
 2 System altered.
 3 
 4 SQL> select sysdate from dual; 
 5 SYSDATE 
 6 --------- 
 7 01-JAN-03
 8 
 9 SQL> select systimestamp from dual; 
10 SYSTIMESTAMP 
11 --------------------------------------------------------- 
12 09-JUL-03 11.05.02.519000 AM -06:00

复制代码

回到顶部

4.date和timestamp 的区别

     date类型是Oracle常用的日期型变量,他的时间间隔是秒。两个日期型相减得到是两个时间的间隔,注意单位是“天”。例如:查看一下当前距离伦敦奥运会开幕还有多长时间:

1 select to_date('2012-7-28 03:12:00','yyyy-mm-dd hh24:mi:ss')-sysdate from dual

结果是:92.2472685185185天,然后你根据相应的时间换算你想要的间隔就行!这个结果可能对程序员有用,对于想直接看到结果的人,这个数字还不是很直观,所以,就引出了timestamp类型

timestamp是DATE类型的扩展,可以精确到小数秒(fractional_seconds_precision),可以是0 to9,缺省是6。两个timestamp相减的话,不能直接的得到天数书,而是得到,
多少天,多少小时,多少秒等,例如:同样查看一下当前距离伦敦奥运会开幕还有多长时间.

1 select to_timestamp('2012-7-28 03:12:00','yyyy-mm-dd hh24:mi:ss')-systimestamp from dual

     结果是:+000000092 05:51:24.032000000,稍加截取,就可以得到92天5小时,51分钟,24秒,这样用户看起来比较直观一些!但是这个数字对程序员来说不 是很直观了,如果想要具体的时间长度的话,并且精度不要求到毫秒的话,可以将timestamp类型转成date类型,然后直接相减即可。

回到顶部

5.date和timestamp之间的相互转换可以通过

to_char来转换timestamp——>date:

1 select to_date(to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') from dual

date ——>timestamp:

1 select to_timestamp(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') from dual

     当使用date和timestamp类型的时候,选择是很清楚的。你可以随意处置date和timestamp类型。当你试图转换到更强大的 timestamp的时候,需要注意,它们既有类似的地方,更有不同的地方,而足以造成破坏。两者在简洁和间隔尺寸方面各有优势,请合理地选择。

© 著作权归作者所有

共有 人打赏支持
粉丝 4
博文 63
码字总数 32485
作品 0
合肥
oracle,mysql,sqlserver--java对日期字段的操作

最近工作中用到了这三种数据库对日期字段的操作,现做如下总结。 1.数据库字段与java类型的对应关系。 明白这对应关系,我们才能正确的使用PreparedStatement设置参数 2.关于日期字段的几点说...

一不留神
2016/07/24
130
0
Oracle JDBC驱动与时间不见了的问题

一般的数据库中,DATE字段仅仅表示日期,不包括日期信息,而Oracle数据库中的DATE数据类型是包括日期、时间的,对于不同的Oracle jdbc驱动版本,对于该问题的处理都有些区别,如果你使用9i或...

三毛々
2012/11/22
0
0
Oracle与PostgreSQL中Timestamp型公元前、后数值的详解及JDBC存取

字段:date value1: 2010-01-01 value2: 2010-01-01BC 1.直接向数据库插入数值时: oracle需要使用to_timestamp('2010-01-01','yyyy-mm-ddBC'), PG可以直接用字符串‘2010-01-01BC'。 2.直...

YuanyuanL
2013/09/18
0
3
DB2、ORACLE SQL写法的主要区别

说实话,ORACLE把国内的程序员惯坏了,代码中的SQL充斥着大量ORACLE特性,几乎没人知道ANSI的标准SQL是什么样子,导致程序脱离了ORACLE根本无法运行,还好随着hibernate的流行,情况有了很大...

cyper
2013/09/30
0
4
Oracle中的日期类型及常用函数

oracle 数据类型详解---日期型(转载) oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资...

猴亮屏
2014/06/03
0
0
java spring jdbc Oracle DATE 类型读取时没有时分秒问题及解决方案

问题出处,公司一个项目中使用动态sql方式查询Oracle数据库,在展示时Date类型字段只展示日期,无时分秒。 分析: 1、众所周知Oralce的日期类型有很多种,Date ,Timestamp等。其中Date类型对...

匆匆里
2012/07/21
0
2
mybatis中mysql和oracle的区别

mysql和oracle语法有一定的差异,我们将服务由部署mysql的服务器迁移到部署oracle的服务器上时,需要修改sql语句。下面说说mybatis中由mysql转为oracle需要修改的语句。 1.批量插入mysql: ...

sietai
05/18
0
0
DB2中字符、数字和日期类型之间的转换

DB2中字符、数字和日期类型之间的转换 一般我们在使用DB2或Oracle的过程中,经常会在数字<->字符<->日期三种类 型之间做转换,那么在DB2和Oracle中,他们分别是如何实现的呢?在Oracle这几个类型...

王小鑫
2015/02/05
0
0
oracle --date-对应 mysql 时间类型的以及空值的处理

因为在做Oracle---->mysql的数据迁移的时候,发现Oracle中的date类型,对应的mysql的时间类型设置不当容易引起错误,特别是存在空值的时候 mysql 版本 5.6.40版本 mysql> desc t1; +-------...

bjxiangqian
05/11
0
0
jsp向MySql中插入时间

在做jsp项目的时候遇到一个问题,就是把java.util.Date类型的数据插入到Mysql中的时候,如果数据库字段类型设置为dateTime类型,数据库中的时间就会变成“0000-00-00 00:00:00”,如果数据库...

学习的小猪
2014/04/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

pbgo: 基于Protobuf的迷你RPC/REST框架

https://www.oschina.net/p/pbgo

chai2010
38分钟前
0
0
rsync工具介绍、常用选项以及通过ssh同步

linux下的文件同步工具 rsync rsync是非常实用的一个同步工具,可以从a机器到b机器传输一个文件,也可以备份数据,系统默认没有这个工具,要使用命令 yum install -y rsync 安装。 rsync的命...

黄昏残影
53分钟前
0
0
OSChina 周四乱弹 —— 表妹要嫁人 舅妈叮嘱……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @哈哈哈哈哈嗝:一定要听——The Pancakes的单曲《咁咁咁》 《咁咁咁》- The Pancakes 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :...

小小编辑
今天
311
4
流利阅读笔记30-20180719待学习

重磅:让人类得老年痴呆的竟是它? Lala 2018-07-19 1.今日导读 去年奥斯卡最佳动画长片《寻梦环游记》里有一句经典台词:“比死亡更可怕的,是遗忘”。在电影中,年迈的曾祖母会重复说一样的...

aibinxiao
今天
3
0
1.16 Linux机器相互登录

Linux机器之间以密码方式互相登录 运行命令#ssh [ip address],标准命令:#ssh [username]@ip, 如果没有写用户名,则默认为系统当前登录的用户 命令#w查看系统负载,可查看到连接到该主机的...

小丑鱼00
今天
0
0
about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
3
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部