日期和时间的存储与处理

关于日期和时间在数据库中经常用到,下面总结了一些这方面的知识。

因为字符集对日期时间有影响,这个是我们首先要关注的,之前的文章中也简单的提到了(http://blog.itpub.net/29876893/viewspace-1627370/)

SQL> select * from nls_session_parameters where rownum<4;

PARAMETER

--------------------------------------------------------------------------------

VALUE

--------------------------------------------------------------------------------

NLS_LANGUAGE

SIMPLIFIED CHINESE

NLS_TERRITORY

CHINA

NLS_CURRENCY

此时该会话的字符集是SIMPLIFIED CHINESE,为了做实验,改成英文:

SQL>  alter session set NLS_LANGUAGE=AMERICAN;

Session altered.

SQL> select * from nls_session_parameters where rownum<4;

PARAMETER

--------------------------------------------------------------------------------

VALUE

--------------------------------------------------------------------------------

NLS_LANGUAGE

AMERICAN

NLS_TERRITORY

CHINA

NLS_CURRENCY

如果读过之前写的文章,已经知道  Language:影响oracle消息,校验,日期命名

SQL> select sysdate from dual;

SYSDATE

------------------

09-MAY-15

默认存储在数据库中的日期是以:DD-MON-YYYY,读取默认是DD-MON-YY

我们可以使用关键字DATE,向数据库中插入日期:

SQL> create table t(t date);

Table created.

SQL> insert into t values(‘09-MAY-15‘);

1 row created.

SQL> insert into t values(DATE ‘1994-8-25‘);

1 row created.

SQL> insert into t values(DATE ‘1994-08-20‘);

1 row created.

SQL> select * from t;

T

------------------

09-MAY-15

25-AUG-94

20-AUG-94

但是使用DATE关键字,此时日期必须使用ANSI标准日期格式:YYYY-MM-DD

我们可以用函数to_char(x[,format]):把x转换成字符串,并用后面提供的格式,下面我们可以把日期转换成我们想要的格式:

SQL> select to_char(t,‘DD-MON-YYYY‘) FROM t;

TO_CHAR(T,‘DD-MON-YY

--------------------

09-MAY-2015

25-AUG-1994

20-AUG-1994

SQL> select to_char(t,‘MON-DD-YYYY‘) FROM t;

TO_CHAR(T,‘MON-DD-YY

--------------------

MAY-09-2015

AUG-25-1994

AUG-20-1994

SQL> select to_char(sysdate,‘DD-MON-YYYY,HH24:MI:SS‘) from dual;

TO_CHAR(SYSDATE,‘DD-MON-YYYY,

-----------------------------

09-MAY-2015,23:58:54

上面只是举简单的例子,关于时间格式化参数可以参考文档。

to_date(x[,format])将x转换为DATE类型:

SQL> select to_date(‘MAY-6-2015‘) from dual;

select to_date(‘MAY-6-2015‘) from dual

*

ERROR at line 1:

ORA-01858: a non-numeric character was found where a numeric was expected

SQL> select to_date(‘5-MAY-2015‘) from dual;

TO_DATE(‘5-MAY-201

------------------

05-MAY-15

注意日期的格式DD-MON-YYYY(DD-MON-YY)所以上面的查询发生错误

SQL> select to_date(‘5-MAY-2015 9:50:45‘,‘DD-MON-YY HH24:MI:SS‘) FROM DUAL;

TO_DATE(‘5-MAY-201

------------------

05-MAY-15

SQL> select to_date(‘5-MAY-2015 9:50:45‘,‘DD-MON-YYYY HH24:MI:SS‘) FROM DUAL;

TO_DATE(‘5-MAY-201

------------------

05-MAY-15

SQL> select to_char(to_date(‘5-MAY-2015 9:50:45‘,‘DD-MON-YYYY HH24:MI:SS‘),‘MON-DD-YYYY HH24:MI:SS‘) FROM DUAL;

TO_CHAR(TO_DATE(‘5-M

--------------------

MAY-05-2015 09:50:45

SQL> select to_char(to_date(‘5-MAY-2015 9:50:45‘,‘DD-MM-YYYY HH24:MI:SS‘),‘MON-DD-YYYY HH24:MI:SS‘) FROM DUAL;

TO_CHAR(TO_DATE(‘5-MAY-20159:

-----------------------------

MAY-05-2015 09:50:45

SQL>  select to_char(to_date(‘5-MAY-2015 9:50:45‘,‘DD-MM-YYYY HH24:MI:SS‘),‘MM-DD-YYYY HH24:MI:SS‘) FROM DUAL;

TO_CHAR(TO_DATE(‘5-

-------------------

05-05-2015 09:50:45

可以结合to_char和to_date,可以使用不同格式的时间值。

我们通过设置nls_date_format,指定日期格式,如果是全局设置,在参数文件中设置,也可以在session中设置啦:

SQL> show parameter nls_date

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

nls_date_format                      string

nls_date_language                    string

SQL> show user;

USER is "HR"

SQL> alter session set nls_date_format=‘MON-DD-YYYY‘;

Session altered.

SQL> select sysdate from dual;

SYSDATE

--------------------

MAY-10-2015

oracle虽然存储了4位年份,但是如果只提供了2位数字,oracle就会根据所使用的格式是YY还是RR来解释世纪:

如果日期中的年份是YY格式,并且只提供了两位年份,那么久认为这一年的世纪和数据服务器上的当前世纪相同,这不必多说。

如果日期中采用的是RR格式,并且只提供了后两位,那么年份中的前两位由两部分决定:

提供年份的两位数字(指定年),数据库服务器上当前日期中年份的后两位数字,规则如下:(设服务器当前日期前两位为F2,指定日期前两位为Z2)

Z2 in (00  ~ 49)   F2 IN(00~49)  同世纪 F2

Z2 IN(50 ~99)   F2 IN(00 ~ 49)   F2-1

Z2 IN(0~49)  F2 IN(50~99)   F2+1

Z2 IN(50~99)  F2 IN(50~99) F2

SQL> select to_char(to_date(‘05-MAY-15‘,‘DD-MM-RR‘),‘DD-MM-YYYY‘) FROM DUAL;

TO_CHAR(TO

----------

05-05-2015

SQL> select to_char(to_date(‘05-MAY-65‘,‘DD-MM-RR‘),‘DD-MM-YYYY‘) FROM DUAL;

TO_CHAR(TO

----------

05-05-1965

就先总结到这里吧!

时间: 2024-10-07 20:07:25

日期和时间的存储与处理的相关文章

Oracle 日期和时间的存储于处理

本章内容包括: 处理并存储一个特定的日期和时间.DATE类型可以存储世纪.4位年份.月.日.时.分和秒 使用时间戳timestamp,时间戳可以存储一个特定的日期和时间.时间戳的优点是可以存储带有小数位的秒,还可以存储时区 使用时间间隔interval,时间间隔可以存储时间的长度.如1年零3个月等. 在Oracle数据库中,默认情况下,日期以DD-MON-YYYY格式保存到数据库中,其中: DD是一个两位的天数 MON是月份中的前三个字母,如FEB YYYY是一个4位的年份. 默认情况下数据库以

(十六)PL/SQL日期及时间

PL/SQL提供两个日期和时间相关的数据类型: 1.日期时间(Datetime)数据类型 DATE TIMESTAMP TIMESTAMP WITH TIME ZONE TIMESTAMP WITH LOCAL TIME ZONE 2.间隔数据类型 INTERVAL YEAR TO MONTH INTERVAL DAY TO SECOND   一.日期时间字段值和间隔数据类型这两个日期时间和间隔数据类型包括字段.这些字段的值确定的数据类型的值.下表列出了时间和间隔的字段及其可能的值. 字段名称

前端学PHP之日期与时间

前面的话 在Web程序开发时,时间发挥着重要的作用,不仅在数据存储和显示时需要日期和时间的参与,好多功能模块的开发,时间通常都是至关重要的.网页静态化需要判断缓存时间.页面访问消耗的时间需要计算.根据不同的时间段提供不同的业务等都离不开时间.PHP为我们提供了强大的日期和时间处理功能,通过内置的时间和日期函数库,不仅能够得到PHP程序在运行时所在服务器中的日期和时间,还可以对它们进行任意检查和格式化,以及在不同格式之间进行转换等.本文将详细介绍PHP中的日期和时间 [注意]关于javascrip

MySQL中日期和时间类型

1 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 日期赋值时,允许"不严格"语法:任何标点符都可以用做日期部分或时间部分之间的间割符.例如,'98-12-31 11:30:45'.'98.12.31 11+30+45'.'98/12/31 11*30*45'和'[email protected]@31 11^30^45'是等价的,对于不合法的将会转换为:0000-00-00 00:00:00 1.1 Date格式 此类型的字段,存储数据

C++日期和时间

C++ 日期 & 时间 C++ 标准库没有提供所谓的日期类型.C++ 继承了 C 语言用于日期和时间操作的结构和函数.为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件. 有四个与时间相关的类型:clock_t.time_t.size_t 和 tm.类型 clock_t.size_t 和 time_t 能够把系统时间和日期表示为某种整数. 结构类型 tm 把日期和时间以 C 结构的形式保存,tm 结构的定义如下: struct tm { int tm

Python之日期与时间处理模块(date和datetime)

本节内容 前言 相关术语的解释 时间的表现形式 time模块 datetime模块 时间格式码 总结 前言 在开发工作中,我们经常需要用到日期与时间,如: 作为日志信息的内容输出 计算某个功能的执行时间 用日期命名一个日志文件的名称 记录或展示某文章的发布或修改时间 其他 Python中提供了多个用于对日期和时间进行操作的内置模块:time模块.datetime模块和calendar模块.其中time模块是通过调用C库实现的,所以有些方法在某些平台上可能无法调用,但是其提供的大部分接口与C标准库

如何在Java 8中愉快地处理日期和时间

原文:http://www.liaoxuefeng.com/article/00141939241051502ada88137694b62bfe844cd79e12c32000 参考:http://www.cnblogs.com/feika/p/4448924.html(更详细些) Java 8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了. java.util.Date月份从0开始,一月是0,十二

Java中的日期和时间

以下内容引用自http://wiki.jikexueyuan.com/project/java/date-time.html: Java在java.util包中提供了Date类,这个类封装了当前的日期和时间. Date类支持两种构造函数.第一个构造函数初始化对象的当前日期和时间. Date() 下面的构造函数接收一个参数等于自1970年1月1日午夜起已经过的毫秒数 Date(long millisec) 一旦有一个可用的日期对象,可以调用以下任何一种支持的方法使用时间: 方法 描述 boolea

Java8 日期和时间实用技巧

新的日期API ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则 Instant: 用来表示时间线上的一个点 LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的 LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的 LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的 Clock: 用于访问当前时刻.日期.时间,用到时区 Duration