Oracle时间格式讨论

本文详细介绍了Oracle数据库中时间格式的存储方式、显示形式及插入数据的方法,并提供了修改会话日期格式的具体步骤。此外还强调了使用Oracle内置时间类型而非字符串的重要性。

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

在网上看见不少oracle新学者对oracle的时间格式很烦,经常是设计了一个带时间字段的表之后,向表插入数据失败。回想起自己刚开始学习oracle时,也对这个时间格式摸不着头脑,虽然是小小的问题,高手们不屑于讨论,但对初学者来讲,这也是一个不大不小的坎,没找到门路的话,可能几天都过不去,其实就是一层窗户纸,没什么难的。这里做一个简单的小结,因水平有限,请高手补充指正。

  1 oracle对时间格式的数据存贮

  oracle数据库中存放时间格式的数据,是以oracle特定的格式存贮的,占7个字节,与查询时显示的时间格式无关,具体哪个字节表示什么,我不太清楚,请高手补充。存贮的时间包括年月日时分秒,最小精度为秒,不存贮秒以下的时间单位。因此在一些前台支持毫秒级的程序(如PB客户端程序)连接到oracle数据库时应注意这点。查询时显示的时间格式,由会话环境决定,或者由用户定义,与数据库无关。

  2 oracle时间显示形式

  通常,客户端与数据库建立起连接后,oracle就会给一个缺省的时间格式数据的显示形式,与所使用的字符集有关。一般显示年月日,而不显示时分秒。例如,使用us7ascii字符集(或者是其他的英语字符集)时,缺省的时间格式显示为:28-Jan-2003,而使用zhs16gbk字符集(或其他中文字符集)时时间格式缺省显示为:2003-1月-28。向表中插入数据时,如果不使用转换函数,则时间字段的格式必须遵从会话环境的时间格式,否则不能插入。查看当前会话的时间格式,可以使用以下的SQL语句:

  SQL> select sysdate from dual;

  3 向oracle表中插入时间格式的数据

  向oracle表插入时间格式的数据是一个相对来讲比较麻烦的事情,要么你严格遵从当前会话的时间格式书写你的时间值,要么使用转换函数自定义时间数据的格式。有两个与时间相关的转换函数:
to_char 和 to_date。to_char(时间值,时间格式)函数将时间值转换为字符串形式,通常在查询中使用;to_date(字符串,时间格式)则把格式字符串转换时间值,通常在insert 语句中使用。在日期格式中,各种日期格式分量这里不作详细的讨论,请查oracle帮助文档中这两个函数的用法,或者查一查PL/SQL编程的书,讲得很详细的。

  4 如何修改会话中的日期格式

  修改当前会话中的日期格式据说有三种办法,我只做过前两种办法的试验,修改glogin.sql文件的办法我没有试过,不知道是不是真的能行。下面一一解说。

  (1) 在sql*plus中修改当前会话的日期格式

SQL> alter session set nls_date_format = /'yyyy-mm-dd hh24:mi:ss/';

  将当前会话的时间格式修改为这种格式: 2003-01-28 15:23:38,即四位年-两位月-两位日,空格,24小时的制的小时:分钟:秒。

  这种修改方法,只对当前会话有效。注意,是对当前会话,而不是当前的sql*plus窗口。即如果你这样修改之后,又使用connect命令以其他用户连接到数据库或者是连接到其他的数据库,则这个日期格式就失效了,又恢复到缺省的日期格式。

  (2) 修改注册表(只对windows系统)

  在注册表//hkey_local_machine//software//oracle//home0主键中增加一个字串(8i版本),字串名为nls_date_format,字串的值为你希望定义的时间格式,如: yyyy-mm-dd hh24:mi:ss
,然后重新启动sql*plus。

  这种修改方法,对sql*plus窗口有效,即不论你打开多少个sql*plus窗口,缺省的都是这种时间格式。修改服务器端的注册表无效,只有修改客户端的注册表才有效。

  unix系统下有没有这类似的方法,我不知道,我不会用unix或者是linux系统。

  (3) 修改$oracle_home//sqlplus//admin目录中glogin.sql文件

  这种方法我没有试过,不敢乱说,以免误导大家。请了解这种方法的高手来指教。

  5 日期格式的优先级

  如果在一个具体的环境中,既修改了注册表,又使用alter session命令修改了当前会话,那么哪一种修改方法有效呢?alter session命令有效,它的优先级是最高的。即不管当前的客户端环境是什么样的,注册表修改成什么样子了,只要你使用了alter session命令来修改了时间格式,那么就以你修改后的时间格式为准。

  因此,如果直接使用sql*plus交互式查询或插入时间格式的数据,两种方法都可以用。如果使用sql文件来进行批量的插入或者是定时执行,最好在使用时间数据前使用alter session命令来修改会话,以保证这个sql语句的正常运行与环境无关。同样的,如果是前台的客户端程序中需要使用到时间格式的数据,最好也在使用之前修改会话,或者使用to_char或to_date函数进行转换(强烈推荐使用转换函数),以保证程序运行与环境无关。

  小结:

  oracle数据库中有关时间类型的数据,定义了很多函数,特别是关于时间数据的计算,非常方便,当然,方便的前提是你对oracle的时间函数比较熟悉。在这里我有时候看到有些人存贮时间类型的数据时使用字符串类型的字段,我强烈的反对这种做法,不论是从系统的开销,还是从时间数据的计算来讲,或者是取这个数据中的某一个子数据,比如取时间中的月,取时间中的星期等等,都不如直接存贮为时间类型的数据来得方便。只要熟悉了oracle关于时间的函数,我相信大家会喜欢上oracle时间类型的数据的,非常灵活,功能强大,几乎可以做你所能想到的关于时间的一切事情——就看你对oracle的时间函数掌握程度了以上在windows 2000 + oracle 805版本测试通过,不对之处,请高手指正。
 

<think>好的,我现在需要处理用户的问题:如何在Oracle数据库中将时间格式的字符串转换为DATE或TIMESTAMP类型。首先,我得回想一下Oracle的相关函数,因为用户提到了使用函数进行转换。 根据用户提供的引用,特别是引用[3]和引用[4],提到了TO_DATE和TO_TIMESTAMP函数。用户可能已经知道这些基本函数,但需要确认具体的用法。例如,TO_DATE是将字符串转为DATE类型,而TO_TIMESTAMP则是转为TIMESTAMP,后者能保留更精确的时间信息,比如毫秒。 接下来,我需要考虑格式模型的重要性。用户提供的示例中显示格式字符串如'YYYY-MM-DD HH24:MI:SS',这必须与输入的字符串严格匹配。例如,如果字符串里有毫秒,就需要在格式模型中包括FF,如引用[1]中的例子。 另外,用户可能遇到常见的错误,比如格式不匹配导致的ORA-01861错误。这时候需要提醒用户检查格式字符串是否正确,或者字符串中是否有意外的空格或字符。例如,如果字符串是'2023-10-25 14:30:00',但格式模型写成了'YYYY-MM-DD HH24:MI:SS',缺少了中间的空格,就会出错。 然后,关于转换后的处理,用户可能需要将DATE或TIMESTAMP再转回字符串,这时候可以用TO_CHAR函数,如引用[4]所示。需要说明这两个方向的转换方法。 可能还需要提到时区的处理,特别是当字符串包含时区信息时,使用TO_TIMESTAMP_TZ函数。不过用户的问题中没有提到时区,所以可能作为扩展知识。 最后,总结步骤,给出具体示例,确保用户能一步步操作。比如,先用TO_DATE转换一个标准字符串,再用TO_TIMESTAMP处理包含毫秒的情况。同时提醒注意事项,如格式模型匹配、错误处理等。 现在需要检查是否有遗漏点。用户可能想知道转换后的类型如何存储,或者转换后的比较、计算问题,但根据问题描述,主要集中在转换本身,所以暂时不需要深入这些方面。另外,是否需要处理不同的日期分隔符,比如斜杠或点?比如'2023/10/25'需要对应的格式模型为'YYYY/MM/DD',这也需要提及。 总之,回答应分步骤,先介绍TO_DATE和TO_TIMESTAMP的基本用法,强调格式模型,给出示例,然后讨论常见错误和注意事项,最后可能提到反向转换和时区处理。确保引用正确的参考资料,如引用[1]、[3]、[4]中的内容,并在适当的位置添加引用标识。</think>在Oracle数据库中将时间格式字符串转换为DATE或TIMESTAMP类型,主要通过内置函数`TO_DATE`和`TO_TIMESTAMP`实现。以下是具体步骤和示例: --- ### **1. 字符串转DATE类型** 使用`TO_DATE`函数,需指定字符串的格式模型(format model)以匹配输入字符串。 **语法**: $$ TO_DATE(\text{字符串}, \text{格式模型}) $$ **示例**: 将字符串`'2023-10-25 14:30:00'`转换为DATE类型: ```sql SELECT TO_DATE('2023-10-25 14:30:00', 'YYYY-MM-DD HH24:MI:SS') FROM dual; ``` **关键格式元素**: - `YYYY`:四位年份 - `MM`:两位月份 - `DD`:两位日期 - `HH24`:24小时制的小时 - `MI`:分钟 - `SS`:秒 --- ### **2. 字符串转TIMESTAMP类型** 若字符串包含更精确的时间(如毫秒),需使用`TO_TIMESTAMP`函数。 **语法**: $$ TO_TIMESTAMP(\text{字符串}, \text{格式模型}) $$ **示例**: 将字符串`'2023-10-25 14:30:45.123456'`转换为TIMESTAMP类型: ```sql SELECT TO_TIMESTAMP('2023-10-25 14:30:45.123456', 'YYYY-MM-DD HH24:MI:SS.FF6') FROM dual; ``` **关键格式元素**: - `.FF6`:表示保留6位小数(微秒级)[^1]。 --- ### **3. 常见问题与注意事项** - **格式模型必须严格匹配**:若字符串与格式模型不一致,会报错`ORA-01861: literal does not match format string`。例如,字符串含毫秒但格式模型缺少`.FF`会报错。 - **默认日期处理**:若未指定时间部分,Oracle会默认时间为`00:00:00`。 - **时区处理**:若字符串包含时区信息(如`+08:00`),需使用`TO_TIMESTAMP_TZ`函数。 --- ### **4. 反向转换(DATE/TIMESTAMP转字符串)** 使用`TO_CHAR`函数可将日期类型转为字符串: ```sql SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual; -- DATE转字符串 SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF6') FROM dual; -- TIMESTAMP转字符串 ```[^4] --- ### **示例总结** | 场景 | 函数 | 示例格式模型 | |-----------------------|--------------------|---------------------------| | 标准日期时间字符串转DATE | `TO_DATE` | `'YYYY-MM-DD HH24:MI:SS'` | | 含毫秒的字符串转TIMESTAMP | `TO_TIMESTAMP` | `'YYYY-MM-DD HH24:MI:SS.FF3'` | | 含时区的字符串转TIMESTAMP | `TO_TIMESTAMP_TZ` | `'YYYY-MM-DD HH24:MI:SS TZH:TZM'` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值