单行函数(4)

步骤三:是针对于天的计算,因为现在已经计算出了年和月,所以天应该刨去年和月的数字信息。那么现在的问题是,如果要想计算天数唯一知道的公式就是 “日期1 - 日期2”,那么日期1 一定使用的是 SYSDATE ,而日期2(应该去掉年和月),可以利用 ADD_MONTHS() 函数实现此功能。

SELECT empno 雇员编号, ename 雇员姓名, hiredate 雇佣日期, TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 已雇佣年数, TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) 已雇佣月数, TRUNC(SYSDATE - ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate))) 已雇佣天数 FROM emp;

范例:EXTRACT() 函数

在 Oracle 9i 之后增加了一个 EXTRACT() 函数,此函数的主要功能是可以从一个日期时间(DATE)或者是时间间隔(INTERVAL)中截取出特定的部分,此函数使用语法如下:

EXTRACT ([YEAR | MONTH | DAY | HOUR | MINUTE | SECOND] | [TIMEZONE_HOUR | TIMEZONE_MINUTE] | [TIMEZONE_REGION | TIMEZONE_ABBR] FROM [日期(date_value) | 时间间隔(interval_value)]);

范例:从日期时间之中取出年、月、日数据

SELECT EXTRACT(YEAR FROM DATE '2001-09-19') years, EXTRACT(MONTH FROM DATE '2001-09-19') months, EXTRACT(DAY FROM DATE '2001-09-19') days FROM dual;

现在是通过一个日期的字符串完成,那么也可以利用当前日期完成。SYSDATE、SYSTIMESTAMP(时间戳)。

SELECT SYSDATE,SYSTIMESTAMP FROM dual;

范例:从时间戳之中取出年、月、日、时、分、秒

SELECT EXTRACT(YEAR FROM SYSTIMESTAMP) years, EXTRACT(MONTH FROM SYSTIMESTAMP) months, EXTRACT(DAY FROM SYSTIMESTAMP) days, EXTRACT(HOUR FROM SYSTIMESTAMP) hours, EXTRACT(MINUTE FROM SYSTIMESTAMP) minutes, EXTRACT(SECOND FROM SYSTIMESTAMP) seconds FROM dual;

除了以上功能之外,主要功能是取得时间间隔,但是在此处需要使用到一个转换函数:TO_TIMESTAMP() ,可以将字符串变为时间戳,而且此时的内容需要使用到部分子查询功能,所以此处只为做个演示。

范例:取得两个日期之间的间隔

SELECT EXTRACT(DAY FROM TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-dd hh24:mi:ss') - TO_TIMESTAMP('1981-09-27 09:08:33','yyyy-mm-dd hh24:mi:ss')) days FROM dual;

范例:取得两个日期时间之间间隔的天、时、分、秒

SELECT EXTRACT(DAY FROM datetime_one - datetime_two) days, EXTRACT(HOUR FROM datetime_one - datetime_two) hours, EXTRACT(MINUTE FROM datetime_one - datetime_two) minutes, EXTRACT(SECOND FROM datetime_one - datetime_two) seconds FROM ( SELECT TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-dd hh24:mi:ss') datetime_one, TO_TIMESTAMP('1981-09-27 09:08:33','yyyy-mm-dd hh24:mi:ss') datetime_two FROM dual);

如果觉得比较麻烦,也可以不使用子查询,按原来的方法写代码就如下:

SELECT EXTRACT(DAY FROM TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-dd hh24:mi:ss') - TO_TIMESTAMP('1981-09-27 09:08:33','yyyy-mm-dd hh24:mi:ss')) days, EXTRACT(HOUR FROM TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-dd hh24:mi:ss') - TO_TIMESTAMP('1981-09-27 09:08:33','yyyy-mm-dd hh24:mi:ss')) hours, EXTRACT(MINUTE FROM TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-dd hh24:mi:ss') - TO_TIMESTAMP('1981-09-27 09:08:33','yyyy-mm-dd hh24:mi:ss')) minutes, EXTRACT(SECOND FROM TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-dd hh24:mi:ss') - TO_TIMESTAMP('1981-09-27 09:08:33','yyyy-mm-dd hh24:mi:ss')) seconds FROM dual;

这样看来,第二种方式就是最差的一种方式了,不推荐使用。

6.5、转换函数

在数据库之中主要使用的数据类型:字符、数字、日期(时间戳),那么这三种数据类型之间就需要实现转换操作,这就属于转换函数的功能。

No.函数名称描述
1   TO_CHAR(日期|数字|列, 转换格式)   将指定的数据按照指定的格式变为字符串型  
2   TO_DATE(字符串|列, 转换格式)   将指定的字符串按照指定的格式变为DATE型  
3   TO_NUMBER(字符串|列)   将指定的数据类型变为数字型  
6.5.1 TO_CHAR() 函数

在默认的情况下,如果查询一个日期,则日期默认的显示格式为“31-1月-12”,而这样的日期显示效果肯定不如常见的“2012-01-31” 让人看起来习惯,所以此时就可以通过TO_CHAR() 函数对这个显示的日期数据进行格式化(格式化之后的数据是字符串),但是如果要完成这种格式化,则首先要熟悉一下格式化日期的替代标记。

日期格式化标记:

No.转换格式描述
1   YYYY   完整的年份数字表示,年有四位,所以使用4个Y  
2   Y,YYY   带逗号的年  
3   YYY   年的后三位  
4   YY   年的后两位  
5   Y   年的最后一位  
6   YEAR   年份的文字表示,直接表示四位的年  
7   MONTH   月份的文字表示,直接表示两位的月  
8   MM   用两位数字来表示月份,月有两位,使用两个M  
9   DAY   天数的文字表示  
10   DDD   表示一年里的天数(001~366)  
11   DD   表示一月里的天数(01~31)  
12   D   表示一周里的天数(1~7)  
13   DY   用文字表示星期几  
14   WW   表示一年里的周数  
15   W   表示一月里的周数  
16   HH   表示12小时制,小时是两位数字,使用两个H  
17   HH24   表示24小时制  
18   MI   表示分钟  
19   SS   表示秒,秒是两位数字,使用两个S  
20   SSSSS   午夜之后的秒数字表示(0~86399)  
21   AM|PM (A.M | P.M)   表示上午或下午  
22   FM   去掉查询后的前导0,该标记用于时间模板的后缀  

在 TO_CHAR() 函数里面,需要两个参数:日期数据,转换格式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4660a92bd9f744bd670d3268e8dfdc88.html