Oracle中关于DateTime的一些描述

本文介绍了Oracle数据库中处理日期和时间的各种方法,包括如何正确使用to_date函数避免格式错误,如何进行日期时间间隔操作,以及如何利用to_char将日期转换为字符格式。还涉及了字符到日期的操作、trunc/ROUND函数的应用等。

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

转载自:http://www.cnblogs.com/fmxyw/archive/2008/08/26/1276850.html
在做话务报表,参考一下信息
to_date()与24小时制表示法及mm分钟的显示:
一、在使用Oracle的to_date函数来做日期转换时,很多Java程序员也许会直接的采用“yyyy-MM-dd HH:mm:ss”的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810 格式代码出现两次”。
如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;
原因是SQL中不区分大小写,MM和mm被认为是相同的格式代码,所以Oracle的SQL采用了mi代替分钟。
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;

二、另要以24小时的形式显示出来要用HH24
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分钟
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm会显示月份  
oracle中的to_date参数含义
    1.日期格式参数含义说明  
D 一周中的星期几  
DAY 天的名字,使用空格填充到9个字符  
DD 月中的第几天  
DDD 年中的第几天  
DY 天的简写名  
IW ISO标准的年中的第几周  
IYYY ISO标准的四位年份  
YYYY 四位年份  
YYY,YY,Y 年份的最后三位,两位,一位  
HH 小时,按12小时计  
HH24 小时,按24小时计  
MI 分  
SS 秒  
MM 月  
Mon 月份的简写  
Month 月份的全名  
W 该月的第几个星期  
WW 年中的第几个星期     1.日期时间间隔操作
  当前时间减去7分钟的时间
  select sysdate,sysdate - interval ’7’ MINUTE from dual
  当前时间减去7小时的时间
  select sysdate - interval ’7’ hour from dual
  当前时间减去7天的时间
  select sysdate - interval ’7’ day from dual
  当前时间减去7月的时间
  select sysdate,sysdate - interval ’7’ month from dual
  当前时间减去7年的时间
  select sysdate,sysdate - interval ’7’ year from dual
  时间间隔乘以一个数字
  select sysdate,sysdate - 8 *interval ’2’ hour from dual
   2.日期到字符操作
  select sysdate,to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual
  select sysdate,to_char(sysdate,’yyyy-mm-dd hh:mi:ss’) from dual
  select sysdate,to_char(sysdate,’yyyy-ddd hh:mi:ss’) from dual
  select sysdate,to_char(sysdate,’yyyy-mm iw-d hh:mi:ss’) from dual
  参考oracle的相关关文档(ORACLE901DOC/SERVER.901/A90125/SQL_ELEMENTS4.HTM#48515)
    3. 字符到日期操作
  select to_date(’2003-10-17 21:15:37’,’yyyy-mm-dd hh24:mi:ss’) from dual
  具体用法和上面的to_char差不多。
    4. trunk/ ROUND函数的使用
  select trunc(sysdate ,’YEAR’) from dual
  select trunc(sysdate ) from dual
  select to_char(trunc(sysdate ,’YYYY’),’YYYY’) from dual
    5.oracle有毫秒级的数据类型
  --返回当前时间 年月日小时分秒毫秒
  select to_char(current_timestamp(5),’DD-MON-YYYY HH24:MI:SSxFF’) from dual;
  --返回当前时间的秒毫秒,可以指定秒后面的精度(最大=9)
  select to_char(current_timestamp(9),’MI:SSxFF’) from dual;
    6.计算程序运行的时间(ms)
  declare
  type rc is ref cursor;
  l_rc rc;
  l_dummy all_objects.object_name%type;
  l_start number default dbms_utility.get_time;
  begin
  for I in 1 .. 1000
  loop
  open l_rc for
  ’select object_name from all_objects ’||
  ’where object_id = ’ || i;
  fetch l_rc into l_dummy;
  close l_rc;
  end loop;
  dbms_output.put_line
  ( round( (dbms_utility.get_time-l_start)/100, 2 ) ||
  ’ seco nds...’ );
  end;
呵呵,不好意思,借用一下别人的东东,我老是忘记了!
<think>我们参考了引用内容,特别是引用[1]和[2]中关于Oracle的TO_DATE和TO_CHAR函数的说明。用户需求:将Oracle数据库中的中文时间字符串转换为标准时间格式。问题关键:如何正确使用TO_DATE函数处理包含中文字符的日期字符串。根据引用[1],TO_DATE函数可以将字符串转换为日期类型,需要指定格式模型。如果字符串中包含中文(比如“年”、“月”、“日”、“时”、“分”、“秒”等),我们需要在格式模型中相应地包含这些中文字符。例如,假设有一个字符串'2023年05月16日',我们想要转换为日期类型。格式模型应为:'YYYY"年"MM"月"DD"日"'。注意,这里的中文字符需要用双引号括起来。同样,如果时间字符串中还包括时间部分(如'14时30分'),则需在格式模型中加入对应的部分,并正确处理中文字符。步骤:1.确定中文时间字符串的具体格式,例如:'2023年05月16日14时30分28秒'2.构建对应的格式模型,如:'YYYY"年"MM"月"DD"日"HH24"时"MI"分"SS"秒"'3.使用TO_DATE函数进行转换。但是注意:格式模型中的非字母字符(如中文)需要用双引号括起来,而格式符(YYYY,MM等)则不需要。示例SQL:假设有一个表t,其中有一个字段chinese_time_str,存储着类似'2023年05月16日14时30分'的字符串。我们将其转换为日期类型:SELECTTO_DATE(chinese_time_str,'YYYY"年"MM"月"DD"日"HH24"时"MI"分"')ASstd_dateFROMt;注意:如果字符串中还有秒,则需要加上SS"秒"。另外,根据引用[2]和[3],我们也可以使用TO_CHAR函数将日期转换回特定格式的字符串(包括中文格式),但用户需求是将中文时间字符串转成标准时间格式(即日期类型,在Oracle内部是以特定格式存储的,但显示时通常以标准格式显示,如:DD-MON-YY,不过我们也可以使用TO_CHAR将其转换为其他标准格式的字符串)。如果用户希望得到标准格式的字符串(比如'YYYY-MM-DDHH24:MI:SS'),则可以先转成日期,再用TO_CHAR转成字符串:SELECTTO_CHAR(TO_DATE(chinese_time_str,'YYYY"年"MM"月"DD"日"HH24"时"MI"分"'),'YYYY-MM-DDHH24:MI:SS')ASstd_date_strFROMt;但是,用户的问题中要求转换为时间格式,可能是指日期数据类型,也可能是特定格式的字符串。根据问题描述,用户最初要求“转换时间格式”,结合引用内容,可能是转换为日期类型(使用TO_DATE)或标准格式的字符串(使用TO_CHAR)。因此,我们根据用户需求给出两种可能:1.转换为日期类型(在数据库内部存储,便于日期计算和比较):使用TO_DATE函数,并指定包含中文的格式模型。2.转换为标准格式的字符串(如:'YYYY-MM-DDHH24:MI:SS'):使用两次转换:先用TO_DATE将中文字符串转为日期,再用TO_CHAR将日期转为标准字符串格式。注意:在转换过程中,如果字符串中确实包含中文,而格式模型中没有正确使用双引号将中文字符括起来,会导致转换错误(ORA-01821)。示例:字符串:'2023年05月16日14时30分'转换为日期类型:TO_DATE('2023年05月16日14时30分','YYYY"年"MM"月"DD"日"HH24"时"MI"分"')如果字符串中不含空格,例如'2023年05月16日14时30分',那么格式模型应为:'YYYY"年"MM"月"DD"日"HH24"时"MI"分"'总结:关键是格式模型中的中文字符需要用双引号括起来,且格式模型必须与字符串严格匹配(包括空格和标点)。根据引用,用户还可以参考Oracle官方文档关于日期格式模型的说明。相关问题:1.如果中文时间字符串中包含“上午”或“下午”,如何处理?2.在Oracle中如何处理带时区的中文时间字符串?3.如何避免在转换中文时间字符串时出现ORA-01821错误?4.如何将中文时间字符串转换成时间戳(TIMESTAMP)类型?5.在日期格式模型中,如何处理连续的中文字符(如“星期一”)?注意:生成的问题仅作示例,实际生成可能略有不同。</think> ### 解决方案:Oracle中文时间字符串转标准格式 要将包含中文的时间字符串(如 `'2023年05月16日 14时30分'`)转换为标准日期格式,需使用 **`TO_DATE` 函数**并指定包含中文字符的格式模型。以下是具体步骤: #### 1. **核心语法** ```sql SELECT TO_DATE(中文时间字符串, '格式模型') AS 标准日期 FROM 表名; ``` #### 2. **格式模型的关键规则** 在格式模型中: - **中文字符需用双引号包裹** 例如:`年` → `"年"`,`时` → `"时"` - **日期/时间部分用字母表示** 例如:`YYYY`(年),`MM`(月),`HH24`(24小时制) #### 3. **实际示例** **场景1**:转换 `'2023年05月16日'` 为日期类型 ```sql SELECT TO_DATE('2023年05月16日', 'YYYY"年"MM"月"DD"日"') AS standard_date FROM dual; ``` **结果**:`2023-05-16`(Oracle 内部存储为日期类型) **场景2**:转换带时间的字符串 `'2023年05月16日 14时30分28秒'` ```sql SELECT TO_DATE( '2023年05月16日 14时30分28秒', 'YYYY"年"MM"月"DD"日" HH24"时"MI"分"SS"秒"' ) AS standard_datetime FROM dual; ``` **结果**:`2023-05-16 14:30:28` #### 4. **转为标准格式字符串** 如需输出 `YYYY-MM-DD HH24:MI:SS` 格式的字符串,需嵌套 `TO_CHAR`: ```sql SELECT TO_CHAR( TO_DATE('2023年05月16日 14时30分', 'YYYY"年"MM"月"DD"日" HH24"时"MI"分"'), 'YYYY-MM-DD HH24:MI:SS' ) AS formatted_str FROM dual; ``` **结果**:`'2023-05-16 14:30:00'` ### 注意事项 1. **严格匹配格式** 若字符串含 `年`/`月`/`时` 等中文字符,格式模型必须包含相同的字符(含双引号),否则报错 **ORA-01821**。 2. **处理12小时制** 若字符串含 `上午`/`下午`,需使用 `AM` 或 `PM`: ```sql TO_DATE('2023年05月16日 下午02时', 'YYYY"年"MM"月"DD"日" PMHH"时"') ``` ### 完整示例 ```sql -- 创建测试表 CREATE TABLE test_time (chinese_str VARCHAR2(50)); INSERT INTO test_time VALUES ('2025年10月01日 08时15分'); -- 转换并输出标准格式字符串 SELECT chinese_str AS 原字符串, TO_CHAR( TO_DATE(chinese_str, 'YYYY"年"MM"月"DD"日" HH24"时"MI"分"'), 'YYYY-MM-DD HH24:MI:SS' ) AS 标准时间 FROM test_time; ``` **输出**: ``` 原字符串 标准时间 ------------------- ------------------- 2025年10月01日 08时15分 2025-10-01 08:15:00 ``` ### 关键点总结 | 组件 | 格式模型示例 | 用途 | |---------------|------------------|--------------------------| | 年份+中文 | `YYYY"年"` | 匹配 `2023年` | | 小时+中文 | `HH24"时"` | 匹配 `14时`(24小时制) | | 分钟/秒 | `MI`/`SS` | 匹配数字部分(无需引号) | | 上午/下午 | `PM` | 匹配 `下午` | --- **相关问题** 1. 如何处理包含“星期几”的中文日期字符串(如 `'2023年05月16日 星期二'`)? 2. 在 `TO_DATE` 函数中,如何处理中文字符与数字混合的非常规格式(如 `'2023-05月-16日'`)? 3. 如何优化转换性能以避免全表扫描? 4. 若中文时间字符串存在空格或不可见字符,应如何清理? 5. 如何将转换后的标准时间与其他日期字段进行比较计算? [^1]: TO_DATE函数基本用法 [^2]: 中文字符在格式模型中的处理逻辑 [^3]: 嵌套TO_CHAR输出特定格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值