Oracle时间情景

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cheng_feng_xiao_zhan/article/details/78608698

限制条件:每年不超过3次。查询网络资源总结如下:

情景1:查询时间大于本年的数据

SELECT *FROM TABLE_CESHIWHERE TIME >TRUNC(SYSDATE,'Y');

函数TRUNC():

TRUNC函数用于对值进行截断(trunc truncate 的简写,中文翻译是 “截断”或 “截短”。)

用法有两种:TRUNC(NUMBER)表示截断数字,TRUNC(date)表示截断日期。

(1)截断数字:

格式:TRUNC(n1,n2)n1表示被截断的数字,n2表示要截断到那一位。n2可以是负数,表示截断小数点前。注意,TRUNC截断不是四舍五入。

SQL>SELECT TRUNC(17.333)FROM DUAL;--17

SQL>SELECT TRUNC(17.333,1)FROM DUAL;--17.3

SQL>SELECT TRUNC(17.333,-1)FROM DUAL;--10

SQL>SELECT TRUNC(17.333,-3)FROM DUAL;--0

SQL>SELECT TRUNC(17.333,5)FROM DUAL;--17.333

SQL>SELECT TRUNC(17,1)FROM DUAL;--17

(2)截断日期:

截取今天:

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'dd')FROM DUAL;--2017/11/22

SQL>SELECT SYSDATE,TRUNC(SYSDATE)FROM DUAL;--2017/11/22

截取本周第一天:

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'d')FROM DUAL;--2017/11/19返回周日

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'D')FROM DUAL;--2017/11/19返回周日

截取本月第一天:

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'MM')FROM DUAL;--2017/11/1

截取本年第一天:

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'y')FROM DUAL;--2017/1/1

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'yy')FROM DUAL;--2017/1/1

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'yyyy')FROM DUAL;--2017/1/1

截取到小时:

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'hh')FROM DUAL;--2017/11/22 19:00:00

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'HH')FROM DUAL;--2017/11/22 19:00:00

截取到分钟:

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'mi')FROM DUAL;--2017/11/22 19:46:00

SQL>SELECT SYSDATE,TRUNC(SYSDATE,'MI')FROM DUAL;--2017/11/22 19:46:00

TRUNC()函数没有秒的精确

 

情景2:查询时间大于12个月的数据

SELECT *FROM TABLE_CESHIWHERE TIME > ADD_MONTHS(SYSDATE,-12);

函数ADD_MONTHS():

ADD_MONTHS函数用于对日期进行操作,有两个参数,第一个参数是日期,第二个参数是对日期进行加减的数字(以月为单位)

3个月以后的时间,可以用下列语句

SQL>SELECT ADD_MONTHS(SYSDATE,3)FROM DUAL;--2018/2/22 20:25:16

3个月以前的时间,可以用下列语句

SQL>SELECT ADD_MONTHS(SYSDATE,-3)FROM DUAL;--2017/8/22 20:25:03

 

拓展:

1 . 取当前日期是星期几中文显示:

SELECT TO_CHAR(SYSDATE,'day')FROM DUAL;

SELECT TO_CHAR(SYSDATE,'DAY')FROM DUAL;

 

2 . 今天是今年的第N

SELECT TO_CHAR(SYSDATE,'DDD')FROM DUAL;

 

3 . 得到日期的季度

SELECT CEIL(TO_NUMBER(TO_CHAR(SYSDATE,'mm'))/3)FROM DUAL;

SELECT TO_CHAR(SYSDATE,'Q')FROM DUAL;

 

4 . 判断某一日子所在年分是否为闰年

SELECT DECODE(TO_CHAR(LAST_DAY(TRUNC(SYSDATE,'y')+31),'dd'),'29','闰年','平年')FROM DUAL;

SELECT DECODE(TO_CHAR(LAST_DAY(TRUNC(ADD_MONTHS(SYSDATE,36),'y')+31),'dd'),'29','闰年','平年')FROM DUAL;  

 

5 . 得到这天的最后一秒

SELECT TRUNC(SYSDATE) + 0.99999 FROM DUAL;

 

6 . 得到明天凌晨000秒的日期

SELECT TRUNC(SYSDATE+1)FROM DUAL;

SELECT TRUNC(SYSDATE)+1 FROM DUAL;

 

7 . 得到下月一日的日期

SELECT TRUNC(ADD_MONTHS(SYSDATE,1),'mm')FROM DUAL;

 

8 . 返回当前月的最后一天

SELECT LAST_DAY(SYSDATE)FROM DUAL;        

SELECT LAST_DAY(TRUNC(SYSDATE))FROM DUAL;  

SELECT TRUNC(LAST_DAY(SYSDATE))FROM DUAL;

SELECT TRUNC(ADD_MONTHS(SYSDATE,1),'mm') - 1 FROM DUAL;--下个月一号减一天

 

9 . 得到一年的每一天(已经区分闰年/平年)

SELECT TRUNC(SYSDATE,'Y')+ RN -1 DAY_FROM (SELECT ROWNUM RNFROM ALL_OBJECTSWHERE ROWNUM<=DECODE(TO_CHAR(LAST_DAY(TRUNC(SYSDATE,'y')+31),'dd'),'29','366','365') );

 

10 . 获取本月第一天开始的7周的周一

SELECT TRUNC(SYSDATE,'mm')+RN*7-7 FROM (SELECT ROWNUM RNFROM ALL_OBJECTSWHERE ROWNUM<7);

 

11 . 获取本周1开始的7周的周一(注意,TRUNC(SYSDATE,'d')得到的是上周的周天,在美国来说相当于这周的第一天,因此TRUNC(SYSDATE,'d')+1+RN*7-7=TRUNC(SYSDATE,'d')-6+RN*7

SELECT TRUNC(SYSDATE,'d')-6+RN*7 FROM (SELECT ROWNUM RNFROM ALL_OBJECTSWHERE ROWNUM<7);

希望对你有帮助,祝你有一个好心情,加油!

若有错误、不全、可优化的点,欢迎纠正与补充!

猜你喜欢

转载自blog.csdn.net/cheng_feng_xiao_zhan/article/details/78608698