日期处理
时间日期类型
- DATE 日期时间类型,包含的时间部分有年、月、日、时、分、秒,不包含秒的小数位和时区。合法的数据范围是January 1, 4712 BC, to December 31, 9999
AD。默认的格式是通过NLS_
DATE_FORMAT显示地设置或者通过NLS_TERRITORY隐式地设置。数据大小为固定的7位。 - TIMESTAMP [(fractional_seconds_precision)] 时间戳类型,包含有年、月、日、时、分、秒,并且秒可以带有精度,精度范围是0位到9位,默认的精度是6位,不带有时区。默认的格式是通过NLS_TIMESTAMP_FORMAT参数显示指定或者通过NLS_TERRITORY参数隐式指定。数据的大小为7-11位,具体的大小取决于设置的精度。
- TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE 带有时区的时间戳类型。
- TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE 带有时区的时间戳类型。
- INTERVAL YEAR [(year_precision)]TO MONTH 存储带有年月的时间期间。
- INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)] 存储带有日、时、分、秒的时间期间。
日期函数
TO_CHAR (datetime,fmt) 日期转格式化,返回类型为VARCHAR2。datetime输入的日期,fmt表示转换的格式。
SELECT to_char(sysdate,‘yyyy-mm-dd‘) FROM dual; select to_char(sysdate,‘dy‘) from dual; #获取星期几
TO_DATE(char,fmt) 字符串转日期,返回类型为DATE。char为输入的日期字符串,fmt表示转换的格式。
SELECT to_date(‘2017-09-13‘,‘yyyy-mm-dd‘) FROM dual; SELECT to_char(TO_DATE(‘7‘,‘dd‘),‘yyyy-mm-dd‘)FROM dual;
- SYSDATE 返回系统的当前时间日期,类型是DATE。
TRUNC(datetime,fmt) 通过指定的格式截取时间,返回类型为DATE。
#当前时间2017-09-13 11:30:32 SELECT TO_CHAR(TRUNC(SYSDATE,‘hh‘),‘yyyy-mm-dd hh24:mi:ss‘) FROM DUAL; #2017-09-13 11:00:00 SELECT TO_CHAR(TRUNC(SYSDATE,‘yy‘),‘yyyy-mm-dd hh24:mi:ss‘) FROM DUAL; #2017-01-01 00:00:00 SELECT TO_CHAR(TRUNC(SYSDATE,‘mm‘),‘yyyy-mm-dd hh24:mi:ss‘) FROM DUAL; #2017-09-01 00:00:00 SELECT TO_CHAR(TRUNC(SYSDATE,‘mi‘),‘yyyy-mm-dd hh24:mi:ss‘) FROM DUAL; #2017-09-13 11:30:00
LAST_DAY(date) 返回系统当月的最后一天的日期,类型为DATE。
SELECT LAST_DAY(SYSDATE) from DUAL;
日期运算
- 对于日期类型我们可以对其执行加法和减法运算,不能执行乘法和除法运算。
- 一个时间类型的数据只可以和INTERVAL和Numeric类型的数据执行加法运算,结果为时间类型。
- Date类型和Date类型相减为Number,表示相差的天数,Date类型和timestamp类型相减为INTERVAL,为INTERVAL,Numeric相减为Date。
ORACLE自动将timestamp转换为date类型的值,而且将Number类型的常数转换为算术的日期,间隔表达式表示一些天数。例如:SYSDATE + 1 表示的是明天的日期;SYSDATE -7表示一周以前;SYSDATE + (10 / (24 * 60))表示10分钟以后的时间。
/** 相差的时间,单位小时 */ SELECT (TO_DATE(‘2017-9-10 12:23:12‘,‘yyyy-mm-dd hh24:mi:ss‘) - TO_DATE(‘2017-9-10 10:23:12‘,‘yyyy-mm-dd hh24:mi:ss‘)) * 24 FROM DUAL;
获取月份之差
select months_between(to_date(‘2017-12-30‘,‘yyyy-mm-dd‘),to_date(‘2017-01-01‘,‘yyyy-mm-dd‘)) from dual;