Oracle数据库(五)日期和时间的处理

日期和时间的存储与处理:
· 时间值(datetime) , 处理并存储日期和时间,如 2005 年 10 月 10 日下午 7:15:30.时间值可以使用DATE类型存储。DATE类型可以存储
世纪、4位年份、月、日、小时(以24小时的格式)、分、秒。
· 时间戳(timestamp ),时间戳可以存储有个特定的日期和时间。提个时间戳可以存储世纪、4位年份、月、日、小时(24小时格式)、分、秒,
与DATE 相比较,时间戳的有点可以存储带有小数位的秒,还可以存储时区。
· 使用时间间隔(interval),时间间隔可以存储时间的长度,如 1 年零 3 个月。

4.1 几个简单的的存储和检索日期的例子:
1)默认情况下,日期以 DD-MON-YYYY 的格式保存到数据库中:
· DD是一个两位的天数,例如 05
· MON是月份中的前三个字母,例如FEB
· YYYY是一个四位的年份,例如1986
PS:
insert into customers(
customer_id , first_name , last_name , dob , phone)
values (7 , ‘Tom’ , ‘Borwn’ , ‘05-5月-1968’ , ‘800-555-1215’) ;
2) 还可以使用DATE关键字向数据库提供一个日期文本字符串,此时日期必须使用ANSI标准日期格式YYYY-MM-DD:
· YYYY 是一个4位的年份
· MM是一个 2 位的月份,值从 1 到 12.
· DD 是一个 2 位的天数
*** ANSI标准日期的优点是使用该标准编写的insert语句在非Oracle数据库中也能够使用。
PS:
要指定日期为1972年 10 月 25 日,可以使用DATE‘1972-10-25’。下面这个insert语句向customers表中添加一行,并指定dob列的值
为DATE’1972-10-25’.
insert into customers (
customer_id , first_name , last_name , dob , phone)
values (8 , ‘Steve’ , ‘purple’ , date ‘1972-10-25’ , ‘800-555-1215’) ;
***默认情况下,数据库以DD-MON-YY的格式显示数据,其中YY是年份的最后两位。
***执行 rollback 可以将之前对于 customers 所做的所欲的操作全部取消。
4.2 使用 to_char() 和 to_date() 进行时间和格式的转换:
1)说明
————————————————————————————
| 函数 | 说明 |
————————————————————————————-
|to_char(x [,format]) |将数字或时间值 x 转换为字符串。该函数还可以为 x 提供可选参数format。|
————————————————————————————–
|to_date(x [,format]) |将字符串 x 转换为 DATE 类型 |
————————————————————————————-
2)使用 to_char()将时间值转换为字符串:
格式的一个例子为:MONTH DD , YYYY 其中:
· MONTH 是大写的月份全名,例如JANUARY
· DD 是2 为的天数
· YYYY是四位的年份
PS:
下面的例子就是使用to_char()函数将customers中的dob列转换为字符串,格式为MONTH DD,YYYY:
select customer_id , to_char(dob , ‘MONTH DD YYYY’) from customers ;
PS2:
下面这个例子使用sysdate函数从数据库中获得当前的日期和时间,并使用to_char()函数将其转换为字符串,格式为
MONTH DD YYYY HH24:MT:SS:
select to_char(sysdate , ‘MONTH DD, YYYY, HH24:MI:SS’) from dual;
TO_CHAR(SYSDATE,’MONTHDD,
————————-
9月 09, 2020, 10:28:00
3)使用to_date()将字符串转换为时间值:
to_date(x [,format]) 函数用于将字符串 x 转换为时间值,该函数可以指定一个可选的字符串format参数来说明
x 的格式 。如果没有指定 format 参数 , 日期就使用默认的格式DD-MON-YYYY 或 DD-MON-YY.
***数据库参数NLS_DATE_FORMAT指定了默认的日期格式 , 但是我们可以修改NLS_DATE_FORMAT的设置。
PS:
select to_date(‘04-JUL-2006’) , to_date(‘04-JUL-06’) from dual ;

	(1)指定时间值格式:
		可以为to_date()函数提供一个可选的参数格式,下面的例子就是使用to_date()函数将字符串July 4,2006转换为日期,
		向to_date()函数传递的格式字符串为MONTH DD , YYYY ;
			select to_date('6月 02,2016' , 'month dd , yyyy') from dual ;
			**由于我的数据库是汉化的版本,因此使用'6月 02,2016'
		PS:下面的例子是将字符串 7.4.06 装换成日期 2006 年 7 月 4 日,而且,最终的日期采用默认的格式DD-MON-YY:
			select to_date('7.4.06' , 'month.dd.yy') from dual;
		PS:组合使用to_date() 和 to_char
			select to_char(to_date('05-5月-1968 19:32:36' , 'dd-month-yyyy hh24:mi:ss') , 'hh24:mi:ss') from dual ;
			TO_CHAR(
			--------
			19:32:36
4)设置默认的日期格式:
	默认的日期格式是在数据库参数 NLS_DATE_FROMAT 中指定的。DBA 可以修改NLS_DATE_FORMAT 的设置,方法时在数据库中
	的init.ora或者spfile.ora文件(数据库启动时会读取这个文件的内容)中设置这个参数的值。DBA 还可以使用 ALTER SYSTEM
	命令对NLS_DATE_FORMAT 的值进行设置 。
	普通的用户也可以使用SQL*PLUS为自己的会话设置NLS_DATE_FORMAT参数,者可以使用ALTER SESSION命令实现。
	SQL > alter session set nls_date_format = 'month-dd-yyyy' ;
	**这样的修改只会对本次的会话产生影响。
5)Oracle 对 2 位年份的处理:
	(1)使用 yy 格式:
		如果在日期中使用的是格式为 YY ,并且只提供了 2 位的年份 ,那么就认为这一年的世纪与数据库服务器上当前设置的
		世纪相同。
	****如果日期中的年份使用 YYYY 格式,但是只提供了 2 位的年份,那么 Oracle 数据库就会使用 YY 格式来解释日期。

4.3 使用时间值函数:
1)add_months()函数:
add-month(x , y) 函数用于计算 x 加上 y 个月的结果 。如果 y 是负数 , 就从 x 中减去 y 个月 。下面的这个例子就是
在2005年1月1日上加13个月:
select add_months(‘01-1月-2015’ , 13) from dual;
2)last_months()函数:
last_month()函数用于计算包含 x 的月的最后一天 , 下面的例子显示了2005年1月的最后一天。
PS:
select last_day(‘01-5月-2006’) from dual ;

		LAST_DAY('01-5
		--------------
		31-5月 -06
3)months_between()函数
	months_between() 函数用于计算 x 和 y 之间有几个月。如果 x 在日历中比 y 早,那么months_between()函数就返回
	一个负数。
	***在调用months_between()函数的时候,日期的次序非常的重要:如果想要结果为正数,小碗的时间必须出现在面前。
	PS:
		select months_between( '03-6月-2013' , '02-3月-2002' ) from dual ;
		
		MONTHS_BETWEEN('03-6月-2013','02-3月-2002')
		-------------------------------------------
		                                 135.032258
		如上图所示,即为 135.032258 个月。
4)next_day() 函数:
	next_day() 函数用于计算从 x 开始 ,下一个 day 的日期;参数 day 是一个文本字符串,例如 Saturday 。
	PS:下面的例子显示了 2005 年 1 月 1 日之后的下一个星期六的日期:
		select next_day('01-1月-2005' , 'saturday') from dual ;
5)round()函数
	round(x [,unit]) 函数用于对 x 进行取整。默认情况下,x 取整为最近的一天。unit 是一个可选的参数,它知名要
	取整的单元。例如:YYYY表示将 x 取整为最近一年的第一天。
		下面的这个例子使用 round() 函数对 2005年10月25日进行取整,取整为最近一年的第一天,因此为2006年1月1日:
	PS:
		select round(to_date('25-11月-2005') , 'YYYY') from dual;
		对月进行取整:
	PS:
		select round(to_date('25-5月-2006') , 'MM') from dual ;
		下面的例子对2005年5月25日晚上7点45分26秒进行取整,取整为最近的小时,因此为晚上8点整:
		select to_char(round(to_date('25-5月-2005 19:45:26' , 'dd-month-yyyy hh24:mi:ss') , 'HH24') , 'yyyy-month-dd HH24:MI:SS') 
		FROM DUAL ;
6)sysdate()函数:
	sysdate()函数用来获取系统的时间。
7)trunc()函数:
	trunc(x [,unit]) 函数用于对 x 进行截断 。默认情况下,x 被截断为当天的开始时间。unit 是一个可选取的参数,它指明
	要截断的单元。例如,‘MM’表示截断为该月的第一天。
	PS:下面的例子使用trunc()函数对2005年5月25日进行截断,截断为当年的第一天,结果为2005年1月1日
		select trunc(to_date('25-5月-05') , 'YYYY') from dual ;
		select trunc(to_date('25-5月-05') , 'MM') from dual ;
		select to_char(trunc(to_date('25-5月-2005 19:45:36' , 'dd-month-yyyy hh24:mi:ss') , 'HH24') , 'yyyy-month-dd hh24:mi:ss') from dual ;
			TO_CHAR(TRUNC(TO_DATE
			---------------------
			2005-5月 -25 19:00:00
		上述的结果变为开始的时间19点
    原文作者:长弓晗炅
    原文地址: https://blog.csdn.net/zd_bcrs/article/details/108589268
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞