步骤三:是针对于天的计算,因为现在已经计算出了年和月,所以天应该刨去年和月的数字信息。那么现在的问题是,如果要想计算天数唯一知道的公式就是 “日期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() 函数里面,需要两个参数:日期数据,转换格式