Oracle数据库:数字函数,日期函数,round,trunc,mod,months_between,add_months,next_day,last_day,sysdate
2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开
测开的话,你就得学数据库,sql,oracle,尤其sql要学,当然,像很多金融企业、安全机构啥的,他们必须要用oracle数据库
这oracle比sql安全,强大多了,所以你需要学习,最重要的,你要是考网络警察公务员,这玩意你不会就别去报名了,耽误时间!
oracle系列文章:
【1】Oracle数据库:啥是oracle数据库?你为啥要学oracle?
【2】Oracle数据库:oracle 11g安装教程,已安装好的oracle各个文件夹的作用,oracle用户权限怎么样
【3】Oracle数据库:oracle启动,oracle客户端工具plsql安装教程和使用方法
【4】Oracle数据库:创建表空间,创建新用户,给用户分配对象、角色和系统权限,登录新用户建表
【5】Oracle数据库:链接配置,包括sqlnet.ora里面的transnames.ora配置数据库标识符SID,listener暂时简单了解
【6】Oracle数据库:net configureation assistant工具配置监听listener,配置本地网络访问服务器上的数据库
【7】Oracle数据库:oracle字符类型、数字类型、创建表表名的命名规则
【8】Oracle数据库:约束条件:主键约束、唯一约束、检查约束、非空约束、外键约束、默认值填写
【9】Oracle数据库:表的关系:一对多,一对一,多对多,一一继承和修改的关系,表不是重点,重点是数据和约束关系
【10】Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作
【11】Oracle数据库:约束行限制where语句,判断条件,比较条件,字符串日期格式,in,like,escape,null语句
【12】Oracle数据库:逻辑运算and,or,not和各种运算的优先级控制
【13】Oracle数据库:排序order by语句,select from where order by的执行先后顺序,各种样例
【14】Oracle数据库:oracle函数,单行函数,多行函数,upper,lower,initcap,字符串函数
oracle数字函数
round,四舍五入
trunc保留小数点位数
mod取模
默认0位小数点
负数的话就是整数的位置,
SQL> select round(11.01,1) from dual;
ROUND(11.01,1)
--------------
11
SQL> select round(11.01,0) from dual;
ROUND(11.01,0)
--------------
11
SQL> select round(11.01,2) from dual;
ROUND(11.01,2)
--------------
11.01
SQL> select round(11.01,-1) from dual;
ROUND(11.01,-1)
---------------
10
SQL> select round(11.01,-2) from dual;
ROUND(11.01,-2)
---------------
0
-1的话,就是整数最后1位四舍五入
啥意思呢
你看看如果最后一个整数是5–9
自然就要进一位了
SQL> select round(16.01,-1) from dual;
ROUND(16.01,-1)
---------------
20
咋样,整数也可以进位的
骚
默认是不保留小数,和0位小数一样
SQL> select round(16.01) from dual;
ROUND(16.01)
------------
16
SQL> select round(16.15, 1) from dual;
ROUND(16.15,1)
--------------
16.2
SQL> select trunc(16.15, 1) from dual;
TRUNC(16.15,1)
--------------
16.1
trunc是不做四舍五入的
SQL> select mod(16, 1) from dual;
MOD(16,1)
----------
0
SQL> select mod(16, 3) from dual;
MOD(16,3)
----------
1
除数取余数
常规骚操作
销售代表
(SA_REP)
SQL> select last_name,salary,mod(salary,5000) from employees where job_id='SA_REP';\
LAST_NAME SALARY MOD(SALARY,5000)
------------------------- ---------- ----------------
Tucker 10000.00 0
Bernstein 9500.00 4500
Hall 9000.00 4000
Olsen 8000.00 3000
Cambrault 7500.00 2500
Tuvault 7000.00 2000
King 10000.00 0
Sully 9500.00 4500
McEwen 9000.00 4000
Smith 8000.00 3000
Doran 7500.00 2500
Sewall 7000.00 2000
Vishney 10500.00 500
Greene 9500.00 4500
Marvins 7200.00 2200
Lee 6800.00 1800
Ande 6400.00 1400
Banda 6200.00 1200
Ozer 11500.00 1500
Bloom 10000.00 0
LAST_NAME SALARY MOD(SALARY,5000)
------------------------- ---------- ----------------
Fox 9600.00 4600
Smith 7400.00 2400
Bates 7300.00 2300
Kumar 6100.00 1100
Abel 11000.00 1000
Hutton 8800.00 3800
Taylor 8600.00 3600
Livingston 8400.00 3400
Grant 7000.00 2000
Johnson 6200.00 1200
30 rows selected
案例也很简单的
oracle日期处理
SQL> select sysdate from dual;
SYSDATE
-----------
2022/10/24
直接当列
SQL> select sysdate from dual;
SYSDATE
SYSDATE+1
-----------
2022/10/25
SQL> select sysdate-1 from dual;
SYSDATE-1
-----------
2022/10/23
日期相减得到的是间隔天数
SQL> select sysdate+1 - sysdate from dual;
SYSDATE+1-SYSDATE
-----------------
1
用系统时间-员工入职时间
SQL> select sysdate-hire_date from employees;
SYSDATE-HIRE_DATE
-----------------
7069.89009259259
6242.89009259259
SQL> select round(sysdate-hire_date) from employees;
ROUND(SYSDATE-HIRE_DATE)
------------------------
7070
6243
SQL> select sysdate + 24/24 from dual;
SYSDATE+24/24
-------------
2022/10/25 21
SQL> select sysdate + 12/24 from dual;
SYSDATE+12/24
-------------
2022/10/25 9:
小时/24就是加小时,/24就是用来区别你加的是天,还是小时的
department_id
SQL> select last_name,(sysdate - hire_date)/7 from employees where department_id=90;
LAST_NAME (SYSDATE-HIRE_DATE)/7
------------------------- ---------------------
King 1009.98481316138
Kochhar 891.841956018519
De Haan 1136.41338458995
1周7天
得到的就是周数
日期函数
操作的对象不同
今天到入职,多少个月了
SQL> select last_name,months_between(sysdate,hire_date) from employees;
LAST_NAME MONTHS_BETWEEN(SYSDATE,HIRE_DATE)
------------------------- ---------------------------------
King 232.254721102151
Kochhar 205.125688844086
De Haan 261.383753360215
200多个月
SQL> select add_months(sysdate,1) from dual;
ADD_MONTHS(SYSDATE,1)
---------------------
2022/11/24 21:32:36
SQL> select add_months(sysdate,-1) from dual;
ADD_MONTHS(SYSDATE,-1)
----------------------
2022/9/24 21:34:31
加一个月,就是11月
指定的天比如星期一–星期日
下个周一是哪天?
SQL> select next_day(sysdate,'星期一') from dual;
NEXT_DAY(SYSDATE,'星期一')
-----------------------
2022/10/31 21:36:39
数字1–7代表的是日一二三四五六
SQL> select next_day(sysdate,1) from dual;
NEXT_DAY(SYSDATE,1)
-------------------
2022/10/30 21:37:18
SQL> select next_day(sysdate,2) from dual;
NEXT_DAY(SYSDATE,2)
-------------------
2022/10/31 21:38:06
懂了吧
这个月的最后一天是哪天
SQL> select last_day(sysdate) from dual;
LAST_DAY(SYSDATE)
-----------------
2022/10/31 21:38:
这个月最后一天
SQL> select round(sysdate) from dual;
ROUND(SYSDATE)
--------------
2022/10/25
默认四舍五入天
你要写具体格式,它再给你四舍五入
一天过去了一半的话,就明天了
年月日
给年四舍五入
SQL> select round(sysdate,'yyyy') from dual;
ROUND(SYSDATE,'YYYY')
---------------------
2023/1/1
给月也是看月过半了没
SQL> select round(sysdate,'mm') from dual;
ROUND(SYSDATE,'MM')
-------------------
2022/11/1
天的话,就是d和dd
SQL> select round(sysdate,'d') from dual;
ROUND(SYSDATE,'D')
------------------
2022/10/23
SQL> select round(sysdate,'dd') from dual;
ROUND(SYSDATE,'DD')
-------------------
2022/10/25
截断到今天,而不是四舍五入
SQL> select employee_id,hire_date from employees where months_between(sysdate,hire_date)<=180;
EMPLOYEE_ID HIRE_DATE
----------- -----------
113 2007/12/7
124 2007/11/16
128 2008/3/8
135 2007/12/12
136 2008/2/6
149 2008/1/29
155 2007/11/23
164 2008/1/24
165 2008/2/23
166 2008/3/24
167 2008/4/21
173 2008/4/21
179 2008/1/4
183 2008/2/3
191 2007/12/19
199 2008/1/13
16 rows selected
受雇月数,小于等于180个月
被雇佣那个月
SQL> select employee_id,hire_date,months_between(sysdate,hire_date),add_months(hire_date,6),next_day(hire_date,6),last_day(hire_date) from employees where months_between(sysdate,hire_date)<=180;
EMPLOYEE_ID HIRE_DATE MONTHS_BETWEEN(SYSDATE,HIRE_DATE) ADD_MONTHS(HIRE_DATE,6) NEXT_DAY(HIRE_DATE,6) LAST_DAY(HIRE_DATE)
----------- ----------- --------------------------------- ----------------------- --------------------- -------------------
113 2007/12/7 178.577728867981 2008/6/7 2007/12/14 2007/12/31
124 2007/11/16 179.287406287336 2008/5/16 2007/11/23 2007/11/30
128 2008/3/8 175.545470803465 2008/9/8 2008/3/14 2008/3/31
135 2007/12/12 178.4164385454 2008/6/12 2007/12/14 2007/12/31
136 2008/2/6 176.609986932497 2008/8/6 2008/2/8 2008/2/29
149 2008/1/29 176.868051448626 2008/7/29 2008/2/1 2008/1/31
155 2007/11/23 179.061599835723 2008/5/23 2007/11/30 2007/11/30
164 2008/1/24 177 2008/7/24 2008/1/25 2008/1/31
165 2008/2/23 176.061599835723 2008/8/23 2008/2/29 2008/2/29
166 2008/3/24 175 2008/9/24 2008/3/28 2008/3/31
167 2008/4/21 174.126115964755 2008/10/21 2008/4/25 2008/4/30
173 2008/4/21 174.126115964755 2008/10/21 2008/4/25 2008/4/30
179 2008/1/4 177.674503061529 2008/7/4 2008/1/11 2008/1/31
183 2008/2/3 176.706761126045 2008/8/3 2008/2/8 2008/2/29
191 2007/12/19 178.190632093787 2008/6/19 2007/12/21 2007/12/31
199 2008/1/13 177.384180480884 2008/7/13 2008/1/18 2008/1/31
16 rows selected
上面这个示例很复杂
但是基本语句都这样
SQL> select round(hire_date,'mm'),trunc(hire_date,'mm') from employees where hire_date like '%02';
ROUND(HIRE_DATE,'MM') TRUNC(HIRE_DATE,'MM')
--------------------- ---------------------
2002/9/1 2002/8/1
2002/9/1 2002/8/1
2002/12/1 2002/12/1
2002/6/1 2002/6/1
2002/6/1 2002/6/1
2002/6/1 2002/6/1
2002/6/1 2002/6/1
7 rows selected
round四舍五入
truncate不会四舍五入
总结
提示:重要经验:
1)
2)学好oracle,即使经济寒冬,整个测开offer绝对不是问题!同时也是你考公网络警察的必经之路。
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。