ORACLE中date类型字段的处理

本文介绍Oracle数据库中日期和时间的处理方法,包括日期格式的设置、字符串与日期间的转换、日期时间的显示与运算等关键操作。

ORACLE/JSP技术涉及日期、时间问题的处理

(1)在英文版本的ORACLE中默认日期格式为'DD-MON-YY',例如'01-JAN-98'

  在汉化的中文版本中ORACLE默认日期格式为'日-月-年',例如'21-8月-2003'或'21-8月-03'

(2)转换字符串为日期
使用ORACLE内部函数to_date()

to_date()函数的参数是to_char()函数参数的反转。

to_date(string_value , date_format)

变量定义如下:

string_value :为字符串直接值(字符串本身)、字符串列(数据库中定义的某个表的某列)或某字符串内部函数的返回值。

date_format为合法的Oracle日期格式。

下列更新语句均符合ORACLE的日期格式,更新成功:

create table student (name varchar2(10) not null primary key , enrolldate date not null);//创建student表

insert into student values('mark',to_date('08-21-2003','MM-DD-YYYY'));

 

insert into student values('mark1',to_date('21-08-2003','DD-MM-YYYY'));

 

insert into student values('mark2','21-8月-2003');

 

insert into xiongxiaomin.student values('mark3','21-8月-03');

(3)转换日期为字符串
使用ORACLE内部函数to_char()
to_char(date_value,date_format

变量定义如下:

date_value :为日期型直接值(日期本身)、日期型列值(数据库中定义的某个表的某列)或某内部函数的返回的日期型值。

date_format为合法的Oracle日期格式。

 

选择enrolldate字段的时间部分:

select (to_char(enrolldate,'HH24:MI:SS'))enrolldate from  student;

 
(4)注意:ORACLE中的date数据类型定义的列包含日期和时间。

1、系统当前日期为2003年8月21,之后执行下列语句

insert into student values('mark5',to_date('09:28:03','HH:MI:SS'));//注意此种在一条记录的date类型字段中插入时间的方法,系统默认的日期为系统当前日期所在月份的第一天,因此得到的记录为

 

Name            enrolldate

 

mark5    01-八月 -2003 09:28:03 AM

 

2、修改系统当前日期为2003年7月21,之后执行下列语句

insert into student values('mark6',to_date('09:28:03','HH:MI:SS'));

得到的记录为

Name            enrolldate

 

mark6     01-七月 -2003 09:28:03 AM

 

insert into student values('mark8',to_date('20:28:03','HH24:MI:SS'));

 
3、同时在一条记录中插入日期和时间的方法

insert into student values('mark9',to_date('21-08-2003

20:28:03','DD-MM-YYYY HH24:MI:SS'));//同时在一条记录中插入日期和时间的方法

 

insert into student values('mark',to_date('21-08-2003

09:52:03','DD-MM-YYYY HH:MI:SS'));//同时在一条记录中插入日期和时间的方法

 
注意不能使用下列方法同时插入日期和时间

insert into student values('mark2','21-8月-2003'+to_date('

09:52:03','HH:MI:SS'));//无效插入记录方法

 
4、在SQL*Plus Worksheet中执行下列SQL语句

select * from student;

得到的记录结果如下:注意date类型字段中只显示了日期,时间并未显示

NAME                 ENROLLDATE

 

mark               18-8月 -03

mark1              21-8月 -03

mark2              21-8月 -03

 

 

 

已选择3行。

 
 
 
 

5、但在JSP程序中同样执行select * from student order by enrolldate

显示结果见下图(既显示了日期,又显示了时间

 

                         JSP页面中的显示结果

6、在SQL*Plus Worksheet中执行下列SQL语句

select name,to_char(enrolldate,'DD-MM-YYYY HH:MI:SS') from student;

得到的记录结果如下:注意date类型字段中显示了日期和时间

NAME                 TO_CHAR(ENROLLDATE,'DD-MM-YYYYHH:MI:SS

mark               21-08-2003 12:00:00

mark1              21-08-2003 12:00:00


已选择2行

注意:5和6中的不同,时间到秒时,JSP页面中显示时多出了". 0"
7、在SQL*Plus Worksheet中执行下列SQL语句

select name,to_char(enrolldate,'DD-MM-YYYY HH24:MI:SS') from student;

得到的记录结果如下:注意date类型字段中显示了日期,时间

NAME                 TO_CHAR(ENROLLDATE,'DD-MM-YYYYHH24:MI:

 

mark               18-08-2003 17:40:20

mark1              21-08-2003 00:00:00

mark2              21-08-2003 00:00:00


已选择3行。

注意:6和7中的SELECT中的"HH:MI:SS"和"HH24:MI:SS"两者的不同是"HH"为小时制,值的范围为0-12;"HH24"为24小时制,值的范围为0-23。

   看下列例子:

①insert into student values('南太里',to_date('08-19-2003
13:54:05','MM-DD-YYYY HH24:MI:SS'));
ORACLE中的记录结果为:
NAME                   enrolldate
南太里                19-八月 -2003 01:54:05 PM
②insert into student values('南太里2',to_date('08-19-2003
13:54:05','MM-DD-YYYY HH:MI:SS'));//插入错误
错误提示为:

insert into student values('南太里2',to_date('08-19-2003 13:54:05','MM-DD

                                                          *

ERROR 位于第 1 行:

ORA-01849: 小时值必须介于 1 和 12 之间

即应用"HH"时,不能应用"13:54:05",而应改为"01:54:05"

正确语句如下:

insert into student values('南太里2',to_date('08-19-2003

01:54:05','MM-DD-YYYY HH:MI:SS'));

ORACLE中的记录结果为:
NAME                   enrolldate

南太里2              19-八月 -2003 01:54:05 AM
注意上述两种方式得出的结果一种为PM,另一种为AM。

为了提高正确性,建议都是用地一种方式"HH24"

8、但在JSP程序中同样执行select name,to_char(enrolldate,'DD-MM-YYYY HH:MI:SS') from student

显示结果见下图。(其结果与在SQL*Plus Worksheet中执行下列SQL语句

select name,to_char(enrolldate,'DD-MM-YYYY HH:MI:SS') from student;相同)

9、在SQL*Plus Worksheet中执行下列SQL语句

select name,to_char(enrolldate,'month dd,yyyy HH24:MI:SS') from student;

得到的记录结果如下:注意date类型字段中显示了日期,时间

NAME                 TO_CHAR(ENROLLDATE,'MONTHDD,YYYYHH24:MI:SS')

 

mark               8月  18,2003 17:40:20

mark1              8月  21,2003 00:00:00

mark2              8月  21,2003 00:00:00


已选择3行。

10、to_char()函数,'DD-MM-YYYY'格式及'MM-DD-YYYY'格式和'month dd,yyyy'格式的不同

'DD-MM-YYYY'格式:21-08-2003

'month dd,yyyy'格式:8月  21,2003

 

11、注意:在日期和时间格式中非常容易混淆的是月份和秒的格式(MM和MI

在SQLPlus*Worksheet中执行下列语句,不报错。

insert into student values('王嘉',to_date('08:05','HH24:MM'));//08被认为是小时,05被认为是月份。

commit;

在表编辑器中查看:实际插入值为

NAME                 ENROLLDATE

王嘉    01-五月 -2003 08:00:00 AM


select name,to_char(enrolldate,'DD-MM-YYYY HH24:MI:SS')enrolldate from

student where name='王嘉';


NAME                 ENROLLDATE

王嘉                 01-05-2003 08:00:00


已选择 1 行。


insert into student values('汪嘉2',to_date('08-19-2003

13:54:05','MM-DD-YYYY HH24:MI:SS'));

 
 

12、使用Oracle的date数据类型的另一个优点是:它支持日期的运算。可以对已经存在的

 

日期加上或减去若干天,例如:

insert into student values('熊',sysdate+7);

<think>首先,用户的问题是:“我想查询在Oracle数据库中对date类型字段进行赋的方法 请问Oracle数据库date类型字段的赋方法”。这是基于提供的引用内容。 我需要参考用户提供的引用: - 引用[1]:展示了使用 `date` 关键字直接赋:`insert into plspl_test_product values ('product name 4', '99.99', date '2005-10-03', 'west');` - 引用[2]:讨论了如何修改日期格式,包括使用 `ALTER SESSION` 和在 `TO_DATE` 函数中指定格式。 - 引用[3]:提到更新Date字段为空的正确方法:通过插入NULL- 引用[4]:使用 `TO_DATE` 函数插入日期数据。 - 引用[5]:涉及Date类型读取时的格式问题,但赋不是焦点。 用户的核心需求是如何给Oracle数据库中的Date类型字段。我需要提供一个清晰、结构化的回答,使用中文,并遵循系统指令。 系统指令包括: - 所有行内数学表达式用 $...$,但这里可能不适用数学表达式,主要是SQL和文本。 - 独立公式用 $$...$$,但同样,这里可能不需要。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如 [^1]。 用户还提到:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中没有“上一次的问题和回答”,因为这是第一个互动。用户说“用户上一次的问题”,但实际上这是初始问题。所以,我应该基于当前引用和问题直接回答。 回答结构: 1. 介绍Date类型Oracle中的赋方法。 2. 列出常见赋方法,参考引用: - 直接使用 `DATE` 关键字(如引用[1])。 - 使用 `TO_DATE` 函数指定格式(如引用[4])。 - 使用会话设置改变默认格式(如引用[2])。 -为NULL(如引用[3])。 3. 给出示例代码,使用代码块。 4. 在回答中引用时添加标识。 5. 最后生成相关问题。 可能的赋方法: - 插入数据时:使用 `DATE 'YYYY-MM-DD'` 或 `TO_DATE('YYYY-MM-DD', 'YYYY-MM-DD')` - 更新数据时:同理,或用NULL设置空- 注意默认格式和会话设置的影响。 从引用[3],用户提到了一个错误:直接用 `SET datecolumn = NULL` 会导致问题,需要通过删除后再插入NULL来解决。但标准方法是应该可以使用 `SET datecolumn = NULL`,可能用户遇到了特定问题。我应该建议正确方法。 标准方法是:`UPDATE table SET datecolumn = NULL WHERE ...` 应该工作。引用[3]中说执行后变成了当前时间,这可能是个错误或配置问题。我应该基于最佳实践回答。 回答大纲: 1. **介绍**:简述Oracle Date类型的常见方法。 2. **赋方法**: a. 使用DATE关键字:`DATE 'YYYY-MM-DD'` b. 使用TO_DATE函数:`TO_DATE('string', 'format')` c. 设置会话格式:`ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'` d. 赋NULL:直接设置为NULL。 3. **示例代码**: - 插入示例 - 更新示例 4. **注意事项**:如默认格式、读取时的显示。 5. **生成相关问题**。 在引用时: - 提到DATE关键字:[^1] - 提到TO_DATE:[^4] - 提到会话设置:[^2] - 提到NULL赋:[^3] 最后,相关问题应基于主题。 相关问题想法: 1. 如何修改OracleDate字段的默认显示格式? 2. 在Oracle中,如何正确处理Date字段的空? 3. 使用TO_DATE函数时有哪些常见错误? 确保语言:中文。 代码块使用Markdown格式。 </think>### Oracle数据库Date类型字段的赋方法 在Oracle数据库中,Date类型字段存储日期和时间信息(精确到秒),赋时需注意格式转换和会话设置,以避免常见错误如格式不匹配或意外。以下是基于Oracle官方文档和实践总结的常用赋方法,参考用户提供的引用内容[^1][^2][^3][^4]。赋主要分为插入(INSERT)和更新(UPDATE)操作两种情况,核心是通过SQL语句直接指定或使用函数转换。 #### 1. **直接使用DATE关键字赋** - 在INSERT语句中,可用 `DATE 'YYYY-MM-DD'` 语法直接赋Oracle会自动识别为Date类型- **示例**:插入一条记录时指定日期。 ```sql INSERT INTO your_table (product_name, price, create_date, region) VALUES ('product name', 99.99, DATE '2005-10-03', 'west'); -- 直接使用DATE关键字[^1] ``` - **优点**:简洁高效,无需额外函数。 - **注意**:日期格式必须为 `YYYY-MM-DD`,否则可能报错。 #### 2. **使用TO_DATE函数转换赋** - 当日期数据来自字符串(如用户输入或外部源)时,需用 `TO_DATE(string, format)` 函数显式转换,确保Oracle正确解析。 - **示例**:在INSERT或UPDATE操作中转换字符串为Date类型。 ```sql -- 插入数据 INSERT INTO your_table (id, event_date) VALUES (1, TO_DATE('2023-12-31', 'YYYY-MM-DD')); -- 指定格式转换[^4] -- 更新数据 UPDATE your_table SET event_date = TO_DATE('2024-01-01 14:30:00', 'YYYY-MM-DD HH24:MI:SS') -- 包含时间部分 WHERE id = 1; ``` - **常见格式参数**: - `YYYY`:四位年份 - `MM`:月份(01-12) - `DD`:日期(01-31) - `HH24`:24小时制小时 - `MI`:分钟 - `SS`:秒 - **优点**:灵活处理任意格式字符串,避免会话设置的影响[^4]。 #### 3. **通过会话设置简化赋** - Oracle的默认日期格式由参数 `NLS_DATE_FORMAT` 控制。修改后,可直接赋字符串而不需 `TO_DATE`。 - **示例**:在会话中设置格式后赋。 ```sql -- 修改当前会话的日期格式 ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; -- 设置格式后,字符串可直接赋[^2] -- 插入数据(无需TO_DATE) INSERT INTO your_table (create_date) VALUES ('2025-05-20'); -- 字符串自动转为Date类型 ``` - **优点**:简化代码,适合批量操作。 - **注意**:此设置仅影响当前会话;重启后失效。默认为 `DD-MON-YY`,可能导致歧义(如 '01-JAN-25'),建议显式转换以避免错误[^2]。 #### 4. **赋NULL(设置字段为空)** -Date字段设为空时,直接使用 `NULL` 关键字。避免误操作(如误转为当前时间)。 - **示例**:更新或插入NULL。 ```sql -- 更新为NULL UPDATE your_table SET event_date = NULL -- 正确方法:直接赋NULL[^3] WHERE id = '78fdb739-3891-4d19-864b-f1f305f464f8'; COMMIT; -- 插入NULL INSERT INTO your_table (id, date_column) VALUES ('new-id', NULL); ``` - **常见错误**:如引用[^3]所述,错误写法(如 `SET datecolumn = null` 后意外变为当前时间)通常由触发器或默认导致;确保表定义中无默认约束。 - **修复方法**:若误操作,可备份数据后重新插入NULL(参考引用[^3]的步骤)。 #### 注意事项 - **格式一致性**:Oracle Date类型包含日期和时间(如 `2023-10-03 00:00:00`),赋时若省略时间部分,默认为午夜(00:00:00)[^5]。 - **读取显示**:查询时Date字段可能显示带 `.0`(如 `2023-10-03 00:00:00.0`),这是内部表示,可使用 `TO_CHAR` 函数格式化输出[^5]。 - **性能建议**:在大量赋操作中,优先使用 `TO_DATE` 或会话设置以减少解析开销;避免在循环中频繁修改会话。 - **错误处理**:赋失败常见原因包括格式不匹配(如月份超出范围)或字符串包含非法字符;使用异常处理(如 `EXCEPTION` 块)捕获错误。 通过以上方法,您可以高效地在Oracle中对Date类型字段。如需进一步优化或处理特定场景,请参考Oracle官方文档。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值