Oracle date 和 timestamp 区别 原文出处: http://www.cnblogs.com/java-class/

本文详细对比了Oracle数据库中的DATE和TIMESTAMP两种数据类型,包括它们的特点、使用场景及相互转换的方法。DATE用于记录日期和时间,而TIMESTAMP则能提供更精细的小数秒级别的精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的时候,需要注意,它们既有类似的地方,更有不同的地方,而足以造成破坏。两者在简洁和间隔尺寸方面各有优势,请合理地选择。

作者:Orson 
出处:http://www.cnblogs.com/java-class/ 
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】 
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】 
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【Orson】 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段 声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

ps -ef | grep ora | grep -v grep oracle 1601559 1 0 18:05 ? 00:00:58 /tmp/OraInstall2025-08-07_06-05-40PM/jdk/jre/bin/java -Doracle.installer.library_loc=/tmp/OraInstall2025-08-07_06-05-40PM/oui/lib/linux -Doracle.installer.oui_loc=/tmp/OraInstall2025-08-07_06-05-40PM/oui -Doracle.installer.bootstrap=TRUE -Doracle.installer.startup_location=/home/haha/database/install -Doracle.installer.jre_loc=/tmp/OraInstall2025-08-07_06-05-40PM/jdk/jre -Doracle.installer.nlsEnabled="TRUE" -Doracle.installer.prereqConfigLoc= -Doracle.installer.unixVersion=5.4.0-26-generic -mx150m -cp /tmp/OraInstall2025-08-07_06-05-40PM::/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/ssh.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/prov_fixup.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/OraPrereq.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/OraPrereqChecks.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/instdb.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/emocmutl.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/instcommon.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/orai18n-utility.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/installcommons_1.0.0b.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/cvu.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/jsch.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/orai18n-mapping.jar:/tmp/OraInstall2025-08-07_06-05-40PM/ext/jlib/remoteinterfaces.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/OraInstaller.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/oneclick.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/xmlparserv2.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/share.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/OraInstallerNet.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/emCfg.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/emocmutl.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/OraPrereq.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/jsch.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/ssh.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/remoteinterfaces.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/http_client.jar:../stage/Components/oracle.swd.opatch/11.2.0.1.0/1/DataFiles/jlib/opatch.jar:../stage/Components/oracle.swd.opatch/11.2.0.1.0/1/DataFiles/jlib/opatchactions.jar:../stage/Components/oracle.swd.opatch/11.2.0.1.0/1/DataFiles/jlib/opatchprereq.jar:../stage/Components/oracle.swd.opatch/11.2.0.1.0/1/DataFiles/jlib/opatchutil.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/OraCheckPoint.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstImages.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstHelp.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstHelp_de.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstHelp_es.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstHelp_fr.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstHelp_it.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstHelp_ja.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstHelp_ko.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstHelp_pt_BR.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstHelp_zh_CN.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/InstHelp_zh_TW.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/oracle_ice.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/help4.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/help4-nls.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/ewt3.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/ewt3-swingaccess.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/ewt3-nls.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/swingaccess.jar::/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/jewt4.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/jewt4-nls.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/orai18n-collation.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/orai18n-mapping.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/ojmisc.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/xml.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/srvm.jar:/tmp/OraInstall2025-08-07_06-05-40PM/oui/jlib/srvmasm.jar oracle.install.ivw.db.driver.DBInstaller -scratchPath /tmp/OraInstall2025-08-07_06-05-40PM -sourceLoc /home/haha/database/install/../stage/products.xml -sourceType network -timestamp 2025-08-07_06-05-40PM -silent -responseFile /home/oracle/db_install.rsp -ignorePrereq oracle 1602206 1601559 0 18:06 ? 00:00:00 /usr/bin/make -f /u01/app/oracle/product/11.2.0/dbhome_1/network/lib/ins_net_client.mk mkldflags ntcontab.o nnfgt.o ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 oracle 1602219 1602206 0 18:06 ? 00:00:00 /bin/sh -c (if [ "compile" = "compile" ] ; then \ /u01/app/oracle/product/11.2.0/dbhome_1/bin/gennttab > ntcontab.c ;\ gcc -m64 -c ntcontab.c ;\ rm -f /u01/app/oracle/product/11.2.0/dbhome_1/lib/ntcontab.o ;\ mv ntcontab.o /u01/app/oracle/product/11.2.0/dbhome_1/lib/ ;\ /usr/bin/ar rv /u01/app/oracle/product/11.2.0/dbhome_1/lib/libn11.a /u01/app/oracle/product/11.2.0/dbhome_1/lib/ntcontab.o ; fi) oracle 1602220 1602219 0 18:06 ? 00:00:00 /bin/sh -c (if [ "compile" = "compile" ] ; then \ /u01/app/oracle/product/11.2.0/dbhome_1/bin/gennttab > ntcontab.c ;\ gcc -m64 -c ntcontab.c ;\ rm -f /u01/app/oracle/product/11.2.0/dbhome_1/lib/ntcontab.o ;\ mv ntcontab.o /u01/app/oracle/product/11.2.0/dbhome_1/lib/ ;\ /usr/bin/ar rv /u01/app/oracle/product/11.2.0/dbhome_1/lib/libn11.a /u01/app/oracle/product/11.2.0/dbhome_1/lib/ntcontab.o ; fi) oracle 1602221 1602220 0 18:06 ? 00:00:00 /bin/sh /u01/app/oracle/product/11.2.0/dbhome_1/bin/gennttab root 1685814 1683817 0 20:27 pts/3 00:00:00 su - oracle oracle 1685833 1685814 0 20:27 pts/3 00:00:00 -bash root 1700879 1692107 0 20:48 pts/3 00:00:00 su - oracle oracle 1700898 1700879 0 20:48 pts/3 00:00:00 -bash oracle 1703258 1700898 0 20:54 pts/3 00:00:00 ps -ef
最新发布
08-09
<think>我们使用`ps -ef | grep ora | grep -v grep`命令来查找正在运行的Oracle相关进程。这个命令的含义如下: - `ps -ef`:列出所有正在运行的进程的详细信息。 - `grep ora`:从`ps -ef`的输出中筛选出包含“ora”的行(通常Oracle进程名中会包含“ora”,如ora_pmon、ora_smon等)。 - `grep -v grep`:排除掉包含“grep”的行,因为`grep ora`命令本身也会被`ps -ef`显示出来,但它不是Oracle进程。 执行这个命令后,我们会得到类似如下的输出(示例): ``` oracle 12345 1 0 10:00 ? 00:00:00 ora_pmon_ORCL oracle 12347 1 0 10:00 ? 00:00:00 ora_vktm_ORCL oracle 12349 1 0 10:00 ? 00:00:00 ora_gen0_ORCL ... ``` 每列的含义如下: - 第一列(UID):运行该进程的用户。 - 第二列(PID):进程ID。 - 第三列(PPID):父进程ID。 - 第四列(C):CPU使用率。 - 第五列(STIME):进程启动时间。 - 第六列(TTY):启动该进程的终端。如果是`?`,表示不是从终端启动,通常是后台进程。 - 第七列(TIME):进程占用CPU的时间。 - 第八列(CMD):启动进程的命令。 ### 注意事项: 1. 如果输出为空,表示当前没有包含“ora”的进程在运行。 2. 如果Oracle进程名不包含“ora”(这种情况很少见),可能需要调整关键字,比如使用`grep oracle`(注意小写)来查找运行用户为oracle的进程,但这样可能会包含非数据库进程(如监听器等)。更精确的做法是使用`grep -E 'ora_|asm_'`来同时匹配Oracle数据库进程ASM进程(如果使用了ASM)。 ### 示例命令扩展: ```bash ps -ef | grep -E 'ora_|asm_' | grep -v grep ``` ### 相关问题: 1. 如何通过进程ID查看Oracle进程的详细信息? 2. 如何终止一个Oracle后台进程? 3. Oracle数据库有哪些必须运行的后台进程? 4. 如何监控Oracle进程的资源使用情况? ### 引用说明: - 关于`ps -ef | grep`命令的解释参考了引用[1]引用[2]。 - 关于Oracle进程的显示参考了引用[3]。 - 关于排除`grep`自身进程的注意事项参考了引用[2]。</think>要查找正在运行的 Oracle 相关进程,请使用以下命令: ```bash ps -ef | grep [o]ra_ ``` ### 命令详解: 1. **`ps -ef`**:列出系统所有进程的完整信息 - `UID`:进程所有者 - `PID`:进程ID - `PPID`:父进程ID - `C`:CPU利用率 - `STIME`:启动时间 - `TTY`:终端设备 - `TIME`:累计CPU时间 - `CMD`:完整命令路径[^1] 2. **`grep [o]ra_`**:精确筛选Oracle进程 - 使用`[o]ra_`替代`ora`避免过滤自身进程 - 匹配Oracle核心后台进程命名模式(如:`ora_pmon_`、`ora_smon_`等) - 无需额外`grep -v grep`过滤[^2] ### 典型输出示例: ```bash oracle 12345 1 0 10:00 ? 00:00:00 ora_pmon_ORCL oracle 12347 1 0 10:00 ? 00:00:00 ora_vktm_ORCL oracle 12349 1 0 10:00 ? 00:00:00 ora_gen0_ORCL oracle 12351 1 0 10:00 ? 00:00:01 ora_mman_ORCL ``` ### 关键进程说明: | 进程名 | 作用 | 重要性 | |--------------|-----------------------|--------| | `ora_pmon_` | 进程监控器 | ★★★ | | `ora_smon_` | 系统监控/崩溃恢复 | ★★★ | | `ora_dbw0_` | 数据库写进程 | ★★★ | | `ora_lgwr_` | 日志写进程 | ★★★ | | `ora_ckpt_` | 检查点进程 | ★★ | | `ora_mman_` | 内存管理器 | ★★ | ### 高级用法: 1. **按进程类型统计**: ```bash ps -ef | grep [o]ra_ | awk '{print $8}' | cut -d'_' -f1 | sort | uniq -c ``` 输出示例: ``` 1 ora_arc 3 ora_dbw 1 ora_lgwr ``` 2. **查看特定实例进程**: ```bash ps -ef | grep [o]ra_ | grep ORCL ``` ### 注意事项: 1. 所有Oracle后台进程应由`oracle`用户运行 2. 父进程ID(PPID)应为1(由init/systemd直接管理) 3. 若输出为空,表示无Oracle实例运行 --- ### 相关问题: 1. 如何区分 Oracle 数据库进程 ASM 存储进程? 2. Oracle 后台进程突然终止该如何诊断? 3. 哪些 Oracle 进程消耗最多 CPU 资源? 4. 如何监控 Oracle 进程的内存使用情况? 5. 在 RAC 环境中如何查看特定节点的进程?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值