时间相关的数据类型
| 序号 | 数据类型 | 说明 | 使用选择 |
|---|---|---|---|
| 1 | DATE | 存储日期和时间信息,精确到秒 | 所占字节最少,最节省空间 |
| 2 | TIMSTAMP | DATE类型的扩展,保留小数级别的秒,默认为小数点后6位 | 所占字节比DATE要多,但比其他两个数据类型少 |
| 3 | TIMESTAMP WITH TIME ZONE | 存储带时区信息的TIMESTAMP | 需要保存时区/地区信息的时候使用 |
| 4 | TIMESTAMP WITH LOCAL TIME ZONE | 和TIMESTAMP WITH TIME ZONE类型的区别:不会保存原时间的时区信息,而是把时间转换为基于数据库时区(database timezone)的时间后存入数据库 | 谨慎使用,不关心操作发生的具体地点,而只关心操作是在当前时区的几点发生 |
关于这几种数据类型的操作
【DATE】
设置格式:
SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
查询系统时间:
SQL> select sysdate from dual;
【TIMESTAMP】
设置格式:
SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT='DD-MON-YY HH:MI:SSXFF';
查询数据库所在系统时间:
SQL> select localtimestamp from dual;
【TIMESTAMP WITH TIME ZONE】
设置格式:
SQL> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT='DD-MON-RR HH:MI:SSXFF AM TZR';
查询数据库所在系统时间(带时区):
SQL> select systimestamp from dual;
【TIMESTAMP WITH LOCAL TIME ZONE】
设置数据库时区(东8区),需要重启数据库才会生效:
SQL> ALTER SESSION SET TIME_ZONE='+08:00';
查询数据库时区:
SQL> select dbtimezone from dual;
几种时间函数
| 序号 | 函数名 | 说明 |
|---|---|---|
| 1 | DBTIMEZONE | 数据库时区 |
| 2 | SESSIONTIMEZONE | 会话时区 |
| 3 | CURRENT_DATE | 当前会话时间 |
| 4 | CURRENT_TIMESTAMP | 当前会话时间戳 (带时区) |
| 5 | SYSDATE | 系统时间/系统时间 |
| 6 | LOCALTIMESTAMP | 系统时间戳/系统时间戳 |
| 7 | SYSTIMESTAMP | 系统时间戳/系统时间戳(带时区) |
注:SYSDATE和SYSTIMESTAMP的返回信息是数据库所在操作系统的信息,和当前会话的时区无关!
弄清楚上边的数据类型之后,当数据库时区和当前操作系统时区不一致时,可以修改数据库时区。
查看数据库时区和会话时区
SQL> select dbtimezone,systimestamp from dual;
修改数据时区
SQL> alter database set time_zone='+8:00';
可能会有以下报错:
ORA-30079: cannot alter database timezone when database has TIMESTAMP WITH LOCAL TIME ZONE columns
从错误提示可以看出数据库中某些字段的数据类型为:TIMESTAMP WITH LOCAL TIME ZONE,只有将这些列删除之后,才能更改。
更改完时区之后需要重启数据库
SQL> shutdown immediate;
SQL> startup;
更新之后,重新查询数据库时区
SQL> select dbtimezone from dual;
本文介绍了Oracle中时间相关的数据类型,如DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE和TIMESTAMP WITH LOCAL TIME ZONE,详细讲解了设置格式和查询系统时间的方法。此外,还探讨了当数据库时区与操作系统时区不一致时如何调整数据库时区,并提供了查看与修改时区的步骤,注意修改可能遇到的错误及解决办法。
2569

被折叠的 条评论
为什么被折叠?



