字符串转换为日期:
select to_date ('22-FEB-11') from dual;
只有这一种不用加格式
这种情况取决于当前的nls_date_format为'dd-MON-yy',若将当前会话的日期格式修改为'yyyy-mm-dd',select to_date('2011-11-21') from dual; 同样是有效的。
select to_date('2011-2-22','YYYY-MM-DD') from dual;
select to_date('2-22-2011','MM-DD-YYYY') from dual;
select to_date('2011-FEB-22','YYYY-MON-DD') from dual;
select to_date(sysdate) from dual;
select sysdate from dual;
日期转换为字符串:
SELECT to_char('1991-01-01','yyyy-mm-dd') FROM dual; 这样写是错的
可以直接 SELECT to_char('1991-01-01') FROM dual;
也可以 SELECT to_char(to_date('1991-01-01','yyyy-mm-dd')) FROM dual;
但是对于取出的日期,如:
SELECT to_char(hire_date,'yy-MON-day') as "DATE" FROM employees;
可以随意取出想要得到的日期格式如'day','month','yyyy'等。
同样适用于sysdate的情况:
SELECT to_char(SYSDATE,'mon') FROM dual;
日期转换为数字:
要先将日期转换为字符串,再转换为数字。
SELECT to_number(to_char(hire_date,'dd')) as "DATE" FROM employees;
所以能转换成数字的局限于能转换成字符串的,也就仅局限于在数据库中取出的日期。转换类型也只能在'dd','mm','yy','yyyy'之中选择.
不能使用SELECT to_number(sysdate,'dd') from dual;之类。
提取年,月,日(结果为个位数,不显示前面的0)
SELECT EXTRACT(DAY FROM SYSDATE) AS "DATE" FROM dual;
SELECT EXTRACT(MONTH FROM SYSDATE) AS "DATE" FROM dual;
SELECT EXTRACT(YEAR FROM SYSDATE) AS "DATE" FROM dual;
日期运算:
1.与sysdate的运算要先将另一个参数转换为date类型,以date类型进行计算,将结果转换为number类型。两个日期直接相减算出来的是天数。
只要可以转换为日期就能运算,或者比较大小,不在于格式。所以在数据库中取出的日期可以直接进行运算。
SELECT to_number(SYSDATE-to_date('2000-01-01','yyyy-mm-dd'))/365 FROM dual;
SELECT (SYSDATE-to_date('2000-01-01','yyyy-mm-dd'))/365 FROM dual;也能得到同样结果。
2.计算月份
优先使用months_between计算月份差,靠后的月份在前。
SELECT MONTHS_BETWEEN ('01-SEP-95','11-JAN-94') FROM dual;
前后两个日期必须都为date类型:
SELECT MONTHS_BETWEEN(TO_DATE('2016-01-01', 'yyyy-mm-dd'),
TO_DATE('2000-01-01', 'yyyy-mm-dd'))
FROM DUAL;
SELECT MONTHS_BETWEEN(TO_DATE('2016-01-01', 'yyyy-mm-dd'), '01-JAN-00') FROM DUAL;
3.计算相关函数:
ADD_MONTHS ('11-JAN-94',6) 11-Jul-94 添加月份
NEXT_DAY ('01-SEP-95','FRIDAY') 8-Sep-95 下个周五
NEXT_DAY ('01-SEP-95',1) 3-Sep-95 下周第一天,本周日
NEXT_DAY ('1995-09-01',1) 报错
NEXT_DAY (to_date('1995-09-01','YYYY-MM-DD'),1) 3-Sep-95 里面必须是日期类型,常用
LAST_DAY('01-FEB-95') 28-Feb-95 本月最后一天
ROUND('25-JUL-95','MONTH') 1-Aug-95
ROUND('25-JUL-95' ,'YEAR') 1-Jan-96
TRUNC('25-JUL-95' ,'MONTH') 1-Jul-95
TRUNC('25-JUL-95','YEAR') 1-Jan-95
4.其他计算
一年中的第几天:
select TO_CHAR(SYSDATE,'DDD'),sysdate from dual;
计算今年的天数:
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual;