SQL日期函数

日期函数提供了常用的日期/时间信息处理功能,比如截断、计算时间差等。Oracle常用日期函数如表4-4所示。
常用日期函数
函 数 功 能 用法
add_months(x, y)    计算在日期x基础上增加y个月后的日期 add_months(sysdate,2)
last_day(x)          返回日期x当月最后一天的日期 last_day(sysdate)
months_between(x, y) 返回日期x和y之间相差的月数 months_between(sysdate,hiredate)
round(x, y)       将日期x四舍五入到y所指定的日期单位(月或年)的第一天 round(sysdate,'month')
trunc(x, y)                  将日期x截断到y所指定的日期单位(月或年)的第一天 round(sysdate,'year')
next_day(x, y)            计算指定日期x后的第一个星期几(由参数y指定)对应的日期

add_months(x, y) 返回在日期/时间x基础上增加y个月后的时间。参数x用于指定起始时间,可以是日期型的常量、字段名或表达式,参数y可以是任意整数。如y值为负数,则返回在日期x基础上减去y个月后的日期/时间;如y值为浮点数,则先将y截断到整数位再进行运算。因此返回值只有年度、月份值可能会发生变化,小时、分、秒的值是不变的。例如:
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') t0,
TO_CHAR(ADD_MONTHS(SYSDATE,2),'yyyy-mm-dd hh24:mi:ss') t1,
TO_CHAR(ADD_MONTHS(SYSDATE,2.5),'yyyy-mm-dd hh24:mi:ss') t2 FROM DUAL;
T0 T1 T2
2014-06-13 14:09:52 2014-08-13 14:09:52 2014-08-13 14:09:52

last_day(x) 返回日期/时间x当月最后一天的日期/时间,小时、分及秒等时间信息不变,例如
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') t0,
TO_CHAR(LAST_DAY(SYSDATE),'yyyy-mm-dd hh24:mi:ss') t1 FROM DUAL;
T0 T1
2014-06-13 14:17:19 2014-06-30 14:17:19

months_between(x, y) 返回日期x和y之间相差的月数。
返回值的符号确定原则:如果x小于(早于)y,则返回负数;如果x大于y,则返回正数;如果x等于y,则返回0。
时间差值的计算规则:如果x和y的“日”相同(比如都是14日)、或者均为月底(比如分别为“3月31日”和“4月30日”),则返回整数;否则Oracle是以31天为基准,计算结果的小数部分,且忽略x和y在小时、分、秒层面的差异。例如:
SELECT MONTHS_BETWEEN(TO_DATE('2008-12-23 01:23:45','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2008-12-23 15:23:45','yyyy-mm-dd hh24:mi:ss')) t0 FROM DUAL; --日相同,返回整数0
SELECT MONTHS_BETWEEN(TO_DATE('2008-12-2 01:23:45','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2008-12-4 01:23:45','yyyy-mm-dd hh24:mi:ss')) t0 FROM DUAL; --以31天为基准,忽略时分秒,结果为-2/31
SELECT MONTHS_BETWEEN(TO_DATE('1989-02-11','yyyy-mm-dd'),TO_DATE('2014-06-13','yyyy-mm-dd')) t0 FROM DUAL ---304.064516129032

round(x, y) 对日期进行四舍五入操作。参数x用于指定原始日期/时间,参数y用于指定四舍五入的方式——如果y的值为'YEAR',则四舍五入到年度第一天(以7月1日为分界线);如果y的值为'MONTH',则四舍五入到月份第一天(以16日为分界线);如果y的值为'DAY',则四舍五入到天的开始(零点零分零秒,以中午12:00为分界线)。例如:
SYSDATE TO_CHAR(ROUND(SYSDATE,'DAY'),' ROUND(SYSDATE,'MONTH') ROUND(SYSDATE,'YEAR')
2014/6/13 15:03:09 2014-06-15 00:00:00 2014/6/1 2014/1/1

trunc(x, y) 对日期/时间进行进行截断操作,其逻辑类似于数值处理中的向下取整。参数x用于指定原始日期/时间,参数y用于指定截断的方式——如果y的值为'YEAR',则截断到当前年度的第一天;如果y的值为'MONTH',则截断到当前月份的第一天;如果y的值为'DAY',则截断到当天的开始(零点零分零秒)。
--SELECT TRUNC(SYSDATE,'DAY') FROM DUAL; --2014/6/8
--SELECT TRUNC(SYSDATE,'YEAR') FROM DUAL; --2014/1/1
--SELECT TRUNC(SYSDATE,'MONTH') FROM DUAL; --2014/6/1

next_day(x, y) 返回指定日期/时间之后的第一个“星期几”所对应的日期/时间(其小时、分、秒数值不变)。参数x用于指定原始日期/时间,参数y用于指定星期几,其值可以是整数1~7(依次对应星期日~星期六)、或字符型的'星期一'~'星期日'(中文语言环境)、或者'Mon'~'Sun'(英文语言环境)。星期一 MON 星期二 TUE 星期三 WED 星期四 THU 星期五 FRI 星期六 SAT 星期天 SUN
SELECT SYSDATE,TO_CHAR(NEXT_DAY(SYSDATE,4),'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
SYSDATE TO_CHAR(NEXT_DAY(SYSDATE,4),'Y
2014/6/13 16:04:17 2014-06-18 16:04:17
SELECT sysdate, to_char(next_day(sysdate,'星期三'),'yyyy-mm-dd hh24:mi:ss') FROM dual;
SELECT SYSDATE,TO_CHAR(NEXT_DAY(SYSDATE,'Wed'),'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
--将当前会话语言环境改为简体中文
ALTER SESSION SET NLS_LANGUAGE='SIMPLIFIED CHINESE';
--将当前会话语言环境改为英文
ALTER SESSION SET NLS_LANGUAGE=american;
SELECT sysdate, to_char(next_day(sysdate,'Wed'),'yyyy-mm-dd hh24:mi:ss') FROM dual;

原文地址:https://www.cnblogs.com/rusking/p/3788483.html