Oracle 关于时间计算

Oracle计算时间差函数
两个Date类型字段:START_DATE,END_DATE,计算这两个日期的时间差
(分别以天,小时,分钟,秒,毫秒):
天:
ROUND(TO_NUMBER(END_DATE - START_DATE))
小时:
ROUND(TO_NUMBER(END_DATE - START_DATE) * 24)
分钟:
ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60)
秒:
ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60)
毫秒:
ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60 * 1000)
 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1           ADD_MONTHS

格式:ADD_MONTHS(D,N)

说明:返回日期时间DN月后对应的日期时间。N为正时则表示D之后;N为负时则表示为D之前;N为小数则会自动先删除小数部分,而用整数部分

举例:

SQL>SELECT ADD_MONTHS(SYSDATE,7) A,ADD_MONTHS(SYSDATE,-7) B,ADD_MONTHS(SYSDATE,7.9)C FROM DUAL;

A                          B                            C

------------------------------------- ------------------

2015/1/2016:07:02 2013/11/20 16:07:02 2015/1/20 16:07:02

2           CURRENT_DATE

格式:CURRENT_DATE

说明:返回当前会话时区所对应的日期

举例:SQL> SELECTCURRENT_DATE A FROM DUAL;

A

-------------------

2014/6/2016:09:04

3           CURRENT_TIMESTAMP

格式:CURRENT_TIMESTAMP([P])

说明:返回当前会话时区所对应的日期时间时间戳P为精度,可以是O9之间的一个整数,默认为6

举例:

SQL>SELECT CURRENT_TIMESTAMP A,CURRENT_TIMESTAMP(9) B FROM DUAL;

A                                     B

----------------------------------------------------------------------------------------------

20-6-14 04.12.33.402000下午+08:00 20-6 -1404.12.33.402000000下午 +08:00

4           DBTIMEZONE

格式:DBTIMEZONE

说明:返回数据库时区

举例:

SQL>SELECT DBTIMEZONE A FROM DUAL;

A

------

+00:00

5           EXTRACT

格式:EXTRACT(C,FROM D)

说明:返回日期时间D中指定的部分CC的取值为YEARMONTHDAYHOURMINUTESECONDTIMEZONE_HOURTIMEZONE_MINUTE, TIMEZONE_REGION, TIMEZONE_ABBR。指定的C必须在D中存在

举例:

抽取年月日

SQL>SELECT EXTRACT(YEAR FROM SYSDATE) A,EXTRACT(MONTH FROM SYSDATE) B,EXTRACT(DAYFROM SYSDATE) C FROM DUAL;

       A         B          C

-------------------- ----------

    2014         6         20

抽取时分秒不能从SYSDATE中抽取,SYSTIMESTAMP返回的UTC标准时间

SQL>SELECT EXTRACT(HOUR FROM SYSTIMESTAMP) A,EXTRACT(MINUTE FROM SYSTIMESTAMP)B,EXTRACT(SECOND FROM SYSTIMESTAMP) C FROM DUAL;

       A         B          C

-------------------- ----------

       8        26    50.052

6           LAST_DAY

格式:LAST_DAY(D)

说明:返回日期D所在月份的最后一天

举例:

SQL>SELECT LAST_DAY(SYSDATE) A FROM DUAL;

A

------------------

2014/6/3016:40:08

7           LOCALTIMESTAMP

格式:LOCALTIMESTAMP([p])

说明:返回当前会话时区的日期时间。P为精度,可以是0-9之间的一个整数,默认为6。与CURRENT_TIMESTAMP在返回值的数据类型上有区别

举例:

SQL>SELECT LOCALTIMESTAMP(4) A FROM DUAL;

A

--------------------------------------------------------------------------------

20-6-14 04.42.09.2800下午

8           MONTHS_BETWEEN

格式:MONTHS_BETWEEN(D1,D2)

说明:返回日期D1D2之间相差的月数。如果D1小于D2,则返回负数:如果D1D2的天数相同或都是月底,则返回整数;或者Oracle以每月31天为准计算结果的小数部分

举例:

SQL>SELECT MONTHS_BETWEEN(SYSDATE,TO_DATE('2013-12-31','YYYY-MM-dd'))A,MONTHS_BETWEEN(SYSDATE,TO_DATE('2015-12-1','YYYY-MM-dd')) A FROM DUAL;

       A         A

--------------------

5.66771318-17.364544

9           NEXT_DAY

格式:NEXT_DAY(D,C)

说明:返回日期D后的下一个CC是一个字符串,表示用当前会话语言表示的一周中某一天的全称(如星期一、星期二等),也可以是数值。

举例:SQL> SELECTNEXT_DAY(SYSDATE,3) A, NEXT_DAY(SYSDATE,'星期一') B FROM DUAL;

A                       B

-------------------------------------------

2014/6/2416:48:562014/6/23 16:48:56

10      ROUND

格式:ROUND(date,fmt)

说明:日期的四舍五入。

fmtyear或者YY,按**1-6月和7-12**四舍五入到最近的几几年11

fmtmonth或者MM,按**1-15日和16-30**四舍五入到最近的几月1

fmtday,按**周一到周三和周四到周日**四舍五入到最近的周日

fmtDD,如果小时超过12,向前进1

fmtHH,如果分超过30,向前进1

fmtMI,到分,秒数30是分界线,相当于四舍五入的5,如果秒超过30,向前进1

fmtSS,精确到秒

举例:

SQL>SELECT ROUND(TO_DATE('2013-11-24 10:31:11','YYYY-MM-DD HH24:MI:SS'),'YY') AFROM DUAL;

A

-----------

2014/1/1

SQL>SELECT ROUND(TO_DATE('2013-11-24 10:31:11','YYYY-MM-DD HH24:MI:SS'),'MM') AFROM DUAL;

A

-----------

2013/12/1

SQL>SELECT ROUND(TO_DATE('2013-11-25 10:31:11','YYYY-MM-DD HH24:MI:SS'),'Day')A,ROUND(TO_DATE('2013-11-25 10:31:11','YYYY-MM-DD HH24:MI:SS'),'DD') B FROMDUAL;

A         B

----------------------

2013/11/242013/11/25

SQL>SELECT ROUND(TO_DATE('2013-11-25 10:31:11','YYYY-MM-DD HH24:MI:SS'),'HH') A,ROUND(TO_DATE('2013-11-2510:31:11','YYYY-MM-DD HH24:MI:SS'),'MI') B FROM DUAL;

A                            B

---------------------------------------

2013/11/2511:00:002013/11/25 10:31:00

11      SESSIONTIMEZONE

格式:SESSIONTIMEZONE

说明:返回当前会话的时区

举例:

SQL>SELECTSESSIONTIMEZONE A FROM DUAL;

A

---------------------------------------------------------------------------

+08:00

12      SYS_EXTRACT_UTC

格式:SYS_EXTRACT_UTC(datetime_wuth_timezone)

说明:返回UTC时间

举例:

SQL>SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP) A FROM DUAL;

A

--------------------------------------------------------------------------------

24-6-14 03.05.09.136892上午

13      SYSDATE

格式:SYSDATE

说明:返回当前时间,数据库驻留的操作系统时间

举例:

SQL>SELECTSYSDATE A FROM DUAL;

A

------------------

2014/6/2411:06:24

14      SYSTIMESTAMP

格式:SYSTIMESTAMP

说明:返回系统时间,包含时区信息,带微秒

举例:

SQL>SELECTSYSTIMESTAMP A FROM DUAL;

A

--------------------------------------------------------------------------------

24-6-14 11.09.50.997760上午+08:00

15      TRUNC

格式:TRUNC(d[,fmt])

说明:截断日期,只有d一个参数时,返回日期时间。

fmtyyyy或者yy时,返回当年第一天

fmtmm时,返回当月第一天

fmtdd时,返回当前年月日

fmtd时,返回当前星期的第一天

fmthh时,截取到当前的小时

fmtmi时,截取到当前的分钟

举例:

SQL>SELECT TRUNC(TO_DATE('2013-11-25 10:31:11','YYYY-MM-DD HH24:MI:SS')) AFROM DUAL;

A

-----------

2013/11/25

SQL>SELECT TRUNC(TO_DATE('2013-11-25 10:31:11','YYYY-MM-DD HH24:MI:SS'),'YYYY')A,TRUNC(TO_DATE('2013-11-25 10:31:11','YYYY-MM-DD HH24:MI:SS'),'YY') BFROM DUAL;

A         B

----------------------

2013/1/1  2013/1/1

SQL>SELECT TRUNC(TO_DATE('2013-11-25 10:31:11','YYYY-MM-DD HH24:MI:SS'),'MM')A,TRUNC(TO_DATE('2013-11-25 10:31:11','YYYY-MM-DD HH24:MI:SS'),'DD') BFROM DUAL;

A         B

----------------------

2013/11/1 2013/11/25

SQL>SELECT TRUNC(TO_DATE('2013-11-25 10:31:11','YYYY-MM-DD HH24:MI:SS'),'D') A FROMDUAL;

A

-----------

2013/11/24

SQL>SELECT TRUNC(TO_DATE('2013-11-25 10:31:11','YYYY-MM-DD HH24:MI:SS'),'HH') A,TRUNC(TO_DATE('2013-11-2510:31:11','YYYY-MM-DD HH24:MI:SS'),'MI') BFROM DUAL;

A                 B

--------------------------------------

2013/11/2510:00:00 2013/11/25 10:31:00


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值