Oracle函数——日期函数
Oracle中的时间类型只有date和TIMESTAMP,TIMESTAMP是比date更精确的类型。日期时间函数用于处理时间类型的数据,Oracle以7位数字格式来存放日期数据,包括世纪、年、月、日、小时、分钟、秒,并且默认日期显式格式为“DD-MON-YY”。在Oracle中准确来说一个礼拜是从星期日开始到星期六结束的,其中时间差以天数为单位。
SYSDATE:取得当前的日期和时间,类型是DATE.它没有参数.但在分布式SQL语句中使用时,SYSDATE返回本地数据库的日期和时间.
SYSTIMESTAMP:9i新增函数,返回当前系统的日期时间及时区。
多种日期格式:
YYYY:四位表示的年份
YYY,YY,Y:年份的最后三位、两位或一位,缺省为当前世纪
IYYY:ISO标准的四位年份
MM:01~12的月份编号
MON:缩写字符集表示
MONTH:全拼字符集表示的月份,右边用空格填补
Q:季度
W:当月第几周
WW:当年第几周
IW:ISO标准的年中的第几周
D:当周第几天
DD:当月第几天
DDD:当年第几天
DY:缩写字符集表示
DAY:全拼字符集表示的天 如(星期六)
HH,HH12:一天中的第几个小时,12进制表示法
HH24:一天中的第几个小时,取值为00~23
MI:一小时中的分钟
SS:一分钟中的秒
SSSS:从午夜开始过去的秒数
select to_char(sysdate, 'yyyy') 年,
to_char(sysdate, 'mm') 月,
to_char(sysdate, 'DD') 日,
to_char(sysdate, 'HH24') 时,
to_char(sysdate, 'MI') 分,
to_char(sysdate, 'SS') 秒,
to_char(sysdate, 'DAY') 天,
to_char(sysdate, 'Q') 第几季度,
to_char(sysdate, 'W') 当月第几周,
to_char(sysdate, 'WW') 当年第几周,
to_char(sysdate, 'D') 当周第几天,
to_char(sysdate, 'DDD') 当年第几天
from dual;
结果:
1、与date操作关系最大的就是两个转换函数:to_date(char[fmt[,'nls_param’]]),to_char(date[,fmt,[,nls_param]])
1.1、to_date(char[fmt[,'nls_param’]]):将字符类型按一定格式转化为日期类型
具体用法:to_date('2004-11-27','yyyy-mm-dd'),前者为字符串,后者为转换日期格式,注意,前后两者要一一对应。
当时间为null时的用法:select to_date(null) from dual;
结果:
1.2、to_char(date[,fmt,[,nls_param]]):将日期转按一定格式换成字符类型 ,fmt,nls_param为可选项,fmt指定了要转化的格式,nls_param指定了返回日期所使用的语言
select to_char(to_date('2018-05-11','yyyy-mm-dd'),'DAY') from dual;
结果:
select to_char(to_date('2018-05-11','yyyy-mm-dd'),'DAY','NLS_DATE_LANGUAGE=American') from dual;
结果:
1.4、设置日期语言:也就是设置nls_session_parameters视图的值
查看参数值:select * from nls_session_parameters where parameter = 'NLS_DATE_LANGUAGE';
修改时间以什么区域方式显示,比如是要显示MONDAY还是要显示星期一:alter session set NLS_DATE_LANGUAGE='American';
日期格式: alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
2、显示数字的英文读法:这个是oracle的特殊用法,也不常用。
select to_char(to_date(222,'J'),'Jsp') from dual;
结果:Two Hundred Twenty-Two
3、TO_TIMESTAMP(char[fmt[,'nls_param’]])函数:应注意char、fmt、nls_param之间的对应关系。
select cast(sysdate as timestamp) date_to_timestamp from dual;
4、TO_TIMESTAMP_TZ(char[fmt[,’nls_param’]])函数:将符合特定日期和时间格式的字符串转变为TIMESTAMP WITH TIME ZONE类型。
5、current_date、current_timestamp、localtimestamp、sessiontimezone、dbtimezone函数
current_date:9i新增函数,返回当前会话时区所对应的日期时间(date型)
current_timestamp:以 timestamp with time zone 数据类型返回当前会话时区所对应的日期时间。
localtimestamp:返回当前会话时区的日期时间
sessiontimezone:返回会话时区(字符型)
dbtimezone:返回数据库所在时区
SELECT current_date,current_timestamp,localtimestamp,sessiontimezone,dbtimezone from dual;
结果:
ZOON时区:
GMT:格林威治时间(老的时间计量标准)
UTC:协调世界时间(我们现在用的时间标准),比GTM更加标准,UTC=GMT
CST:中央标准时间 CDT:中部夏令时
PST:太平洋时间 PDT:太平洋夏令时
EST: 东部标准时间 EDT:东部夏令时间 EST=UTC-5;
6、FROM_TZ(timaezone_stamp,timezone_value)函数:将时区值和TIMESTAMP(时间戳)转换为TIMESTAMP WITH TIME ZONE值。
结果:
7、TZ_OFFSET(time_zone_name||sessiontimezone||dbtimezone):返回特定时区与UTC相比的时区偏移。
8、SYS_EXTRACT_UTC(timestamp)函数:将一个timestamptz转换成UTC时区的本地时间
9、NEW_TIME(date,timezone1,timezone2):计算当时区timezone1中的日期和时间是date时候,返回时区timezone2中的日期和时间
select NEW_TIME(to_date('2018-05-14 12:00:00','yyyy-mm-dd hh24:mi:ss'),'GMT','EST'),to_date('2018-05-14 12:00:00','yyyy-mm-dd hh24:mi:ss') from dual;
结果:
10、ADD_MONTHS(d,n)函数:在某一个日期d上,加上指定的月数n,n可以是任意整数。返回计算后的新日期
select floor(to_date('2018-05-03 20:00:00','yyyy-mm-dd hh24:mi:ss')-to_date('2018-05-01 12:00:00','yyyy-mm-dd hh24:mi:ss')) A from dual;
结果:
12、NumtoDSinterval(n,char_expr)函数:将数字n转换为INTERNAL DAY TO SECOND(内部时间)格式;char_expr是一个字符串,可以是DAY\HOUR\MINUTE或SECOND。【DS表示 DAY——>SECOND】
select sysdate,sysdate+numtoDSinterval(3,'hour') from dual;
结果:
13、TO_DSINTERVAL函数:可以对日期随意加减,如下例:对原来的时间加一天。参数格式为 天数 时,分,秒
select sysdate,TO_DSINTERVAL('01 00:00:00')+sysdate from dual;
结果:
14、NUMTOYMINTERVAL(n,char_expr)函数:将数字n转换为INTERVAL YEAR TO MONTH格式,char_expr可以是year或者month。【YM表示 YEAR——>MONTH】
select sysdate,sysdate+numtoyminterval(3,'year') from dual;
结果:
15、TO_YMINTERVAL(char)函数:参数要求格式必须是'xx-xx'.例如'02-08' 就表示某两个时间差了 2年零 8个月.
select sysdate,sysdate + to_yminterval('02-08') from dual;
结果:
16、Last_day(d)函数:返回包含了日期参数的月份的最后一天的日期。是处理月份天数不定的办法,可以用来计算当月中剩余天数。
select to_char(add_months(last_day(sysdate)+1,-1),'yyyy-mm-dd'),last_day(sysdate) from dual;
结果:
17、months_between(date1,date2)函数:计算date1和date2之间相差的月数.如果date1<date2,则返回负数;如果date1,date2这两个日期中日分量信息是相同的,或者这两个日期都分别是所在月的最后一天,那么返回的结果是一个整数,否则包括一个小数,小数为富余天数除以31,Oracle以每月31天为准计算结果。
select months_between(to_date('2018-02-11','yyyy-mm-dd'),to_date('2018-05-11','yyyy-mm-dd'))"month" from dual;
结果:-3
select sysdate,next_day(sysdate,'星期五') next_day from dual;
结果:
19、EXTRACT(fmt FROM d)函数:提取日期中的特定部分。fmt 为:YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。其中 YEAR、MONTH、DAY可以为 DATE 类型匹配,也可以与 TIMESTAMP 类型匹配;但是 HOUR、MINUTE、SECOND 必须与 TIMESTAMP 类型匹配。HOUR 匹配的结果中没有加上时区,因此在中国运行的结果小 8 小时。
SELECT SYSDATE , EXTRACT(YEAR FROM SYSDATE) "year", EXTRACT(MONTH FROM SYSDATE) "month", EXTRACT(DAY FROM SYSDATE) "day", EXTRACT(HOUR FROM SYSTIMESTAMP) "hour", EXTRACT(MINUTE FROM SYSTIMESTAMP) "minute", EXTRACT(SECOND FROM SYSTIMESTAMP) "second" FROM dual;
结果:
20、ROUND(d[,fmt])函数:将日期d按照由fmt指定的格式进行四舍五入处理.如果没有给fmt则使用缺省设置'DD'.
① 如果 fmt 为“YEAR”则舍入到某年的 1 月 1 日,即前半年舍去,后半年作为下一年。
② 如果 fmt 为“MONTH”则舍入到某月的 1 日,即前月舍去,后半月作为下一月。
③ 默认为“DD”,即月中的某一天,最靠近的天,前半天舍去,后半天作为第二天。
④ 如果 fmt 为“DAY”则舍入到最近的周的周日,即上半周舍去,下半周作为下一周周日。
SELECT SYSDATE,ROUND(SYSDATE),ROUND(SYSDATE,'day'),ROUND(SYSDATE,'month'),ROUND(SYSDATE,'year') FROM dual;
结果:
21、TRUNC(d[,format]):截断日期时间数据,计算截尾到由format指定单位的日期d.缺省参数同ROUNG(d[,fmt]).
select sysdate,trunc(sysdate),trunc(sysdate,'year') YEAR,to_char(trunc(sysdate,'hh'),'hh24')Hours from dual;
结果:
select Days,
A,
trunc(A * 24) Hours,
trunc(A * 24 * 60 - 60 * TRUNC(A * 24)) Minutes,
trunc(A * 24 * 60 * 60 - 60 * TRUNC(A * 24 * 60)) Seconds,
trunc(A * 24 * 60 * 60 * 100 - 100 * TRUNC(A * 24 * 60 * 60)) mSeconds
from (select trunc(sysdate) Days, sysdate - trunc(sysdate) A from dual)
结果:
22、组合用法:
方式一:使用TO_CHAR(SYSDATE,'D')可以求得当前日期是一周的第几天,得到的结果是星期日开始作为第1天的,那么星期一就是第2天,星期日就是第8天。
select to_char(sysdate, 'yyyy-mm-dd') 今天,
decode(to_char(sysdate, 'D'),
'1',
'星期日',
'2',
'星期一',
'3',
'星期二',
'4',
'星期三',
'5',
'星期四',
'6',
'星期五',
'7',
'星期六') 星期几,
to_char(sysdate - to_number(to_char(sysdate, 'D')) + 2, 'yyyy-mm-dd') 星期一,
to_char(sysdate - to_number(to_char(sysdate, 'D')) + 8, 'yyyy-mm-dd') 星期日
from dual;
方式二:SUBSTR代替DECODE函数,NEXT_DAY函数可以指定当前日期的下一个星期几的日期,比如:今天是2018-5-14日,星期五,那么Next_Day(sysdate,'星期一'),得到的日期就是5-21,那么这个星期一的日期就是5-21减去7天,而星期日的日期就是5-21减去1天.
select to_char(sysdate, 'yyyy-mm-dd') 今天,'星期'||substr('日一二三四五六',to_number(to_char(sysdate,'d')),1) 星期几,
to_char(next_day(sysdate,'星期一')-7,'yyyy-mm-dd') 星期一,
to_char(next_day(sysdate,'星期一')-1,'yyyy-mm-dd') 星期日
from dual;
结果:
22.2、查找2018-05-14至2018-05-01间除星期一和七的天数
select count(*)
from (select rownum - 1 rnum
from all_objects
where rownum <= to_date('2018-05-14', 'yyyy-mm-dd') -
to_date('2018-05-01', 'yyyy-mm-dd') + 1)
where to_char(to_date('2018-05-01', 'yyyy-mm-dd') + rnum - 1, 'D') not in
('1', '7')
结果:
22.3、找出今年的天数:
select add_months(trunc(sysdate,'year'),12)-trunc(sysdate,'year') from dual;
结果:365
闰年的处理方法:
select to_char(last_day(to_date('2018'||'02','yyyymm')),'dd') from dual;
如果是28就不是闰年
22.4、五秒钟一个间隔:
select to_char(sysdate, 'SSSSS') / 300,
floor(to_char(sysdate, 'SSSSS') / 300),
floor(to_char(sysdate, 'SSSSS') / 300) * 300,
to_date(floor(to_char(sysdate, 'SSSSS') / 300) * 300, 'SSSSS')隔五秒一个间隔
from dual;
结果:
22.5、查找月的第一天,最后一天
SELECT sysdate,
Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month,
Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,
(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month
FROM dual;
结果:
22.6、查询某周的第一天,例如2018年第二周。
方法一:
select trunc(decode(ww,
53,
to_date(yy || '1231', 'yyyymmdd'),
to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')),
'd') - 6 first_day
from (select substr('2018-2', 1, 4) yy, to_number(substr('2018-2', 6)) ww
from dual);
方法二:
select trunc(to_date(substr('2018-2',1,5)||to_char((to_number(substr('2018-2',6)))*7),'yyyy-ddd'),'d')-6 first_day from dual;
方法三:
- select min(v_date) first_day
- from (select (to_date('201801', 'yyyymm') + rownum-1) v_date
- from all_tables
- where rownum < 370)
- where to_char(v_date, 'yyyy-iw') = '2018-02';
结果:
22.7、查询某周的最后一天
方法一:
- select trunc(decode(ww,
- 53,
- to_date(yy || '1231', 'yyyymmdd'),
- to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')),
- 'd') last_day
- from (select substr('2018-02', 1, 4) yy, to_number(substr('2018-02', 6)) ww
- from dual);
方法二:
select trunc(to_date(substr('2018-02',1,5)||to_char((to_number(substr('2018-02',6)))*7),'yyyy-ddd'),'d') last_day from dual
方法三:
- select max(v_date) last_day
- from (select (to_date('201801', 'yyyymm') + rownum-1) v_date
- from all_tables
- where rownum < 370)
- where to_char(v_date, 'yyyy-iw') = '2018-02';
22.8、查询某周的日期
一、
select v_date,to_char( v_date, 'day') day
from (select (to_date('201801', 'yyyymm') + rownum - 1) v_date
from all_tables
where rownum < 370)
where to_char(v_date, 'yyyy-ww') = '2018-01';
二、
select min_date, to_char(min_date, 'day') day
from (select to_date(substr('2018-01', 1, 4) || '001' + rownum - 1,
'yyyyddd') min_date
from all_tables
where rownum <= decode(mod(to_number(substr('2018-01', 1, 4)), 4),
0,
366,
365)
union
select to_date(substr('2018-01', 1, 4) - 1 ||
decode(mod(to_number(substr('2018-01', 1, 4)) - 1, 4),
0,
359,
358) + rownum,
'yyyyddd') min_date
from all_tables
where rownum <= 7
union
select to_date(substr('2018-01', 1, 4) + 1 || '001' + rownum - 1,
'yyyyddd') min_date
from all_tables
where rownum <= 7)
where to_char(min_date, 'yyyy-ww') = '2018-01';
结果:
Oracle函数——日期函数的更多相关文章
- javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数
javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数 1.常规函数 javascript常规函数包括以下9个 ...
- 第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数
第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; ...
- Oracle之单行函数(字符串函数/数字函数/转换函数/日期函数/通用函数)
虚拟表DUAL介绍: dual是一张虚拟表,只有一行一列,用来构成select的语法规则. Oracle的查询中,必须使用"select 列- from 表"的完整语法,当查询单行 ...
- SQL 标量函数-----日期函数datediff()、 day() 、month()、year()
select day(createtime) from life_unite_product --取时间字段的天值 select month(createtime) from life_uni ...
- SQL 标量函数-----日期函数 day() 、month()、year()
select day(createtime) from life_unite_product --取时间字段的天值 select month(createtime) from life_unite_p ...
- SQL标量函数-日期函数
select day(createtime) from life_unite_product --取时间字段的天值 select month(createtime) from life_uni ...
- MySQL 进阶4 SQL常见函数: 字符函数/数学函数/日期函数/流程控制函数(if/case)
# 进阶4 SQL常见函数 分类: 1/单行函数: 字符函数: concat(),length(),ifnull(__,default) ,instr(), trim(),upper(),lower( ...
- SQL 标量函数-----日期函数 day() 、month()、year() 转载
select day(createtime) from life_unite_product --取时间字段的天值 select month(createtime) from life_u ...
- ORACLE 常用日期函数
1 . add_months(arg1,num) 返回日期arg1加num个月的新日期. select add_months(date'2011-1-1',1) from dual; result: ...
随机推荐
- arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)
你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...
- Odoo Tech World 2018(上海)互联网开源技术大会通告
会议概述 点击进入活动报名通道 高成本的软件开发,耗时的系统安装,繁琐的操作培训… 这一系列问题都是企业数字化管理的痛点, "软件"成为发展数企业数字化转型的瓶颈, 无论是小厂家或 ...
- openlayers一:显示地图与鼠标地理坐标
openlayers两个好用的开源JS互动地图库之一,另一个是leaflet. openlayers的特点是是大而全,自身包含绝大多数功能,文档好看. leaflet是小而美,自身小,但支持扩展,好用 ...
- Windows下安装lxml库方法
如果直接用pip install lxml安装成功,那么恭喜!!! 一般在windows安装都十分蛋疼,pip无法直接安装(提示错误一大片,此处省略……) 因此选择wheel安装方式,步骤如下: 1. ...
- 计算器模拟器中的情怀——Free42简介
说到情怀,我首先想聊几句电子计算器的历史.电子计算器这种东西,在最近这几十年的人类发展中,曾经起到过相当重要的作用,尤其是在七十年代到九十年代初这个时期,大型的全功能电脑贵得要命,有钱有时也买不到,而 ...
- mysql 8 nodejs连不上
https://www.jianshu.com/p/bf37e0bc7080 alter user 'root'@'localhost' identified with mysql_native_pa ...
- mapbox.gl文字标注算法基本介绍
Well-placed labels can be the difference between a sloppy map and a beautiful one. Labels need to cl ...
- 百度APP移动端网络深度优化实践分享(二):网络连接优化篇
本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<二>连接优化>,感谢原作者的无私分享. 一.前言 在<百度APP移动端网 ...
- 单例模式的优化之路(java)
1.概述 最近在优化公司以前老项目的代码时,发现有些类的代码频繁地创建和销毁对象,资源消耗比较严重.针对这些做了一些优化,改用单例模式,避免频繁的创建和销毁对象,说起单例模式,相信每个人都会写,接下来 ...
- 那些优秀的.NET开发者----汪宇杰:从重视细节,到成就技术专家
初识汪宇杰 在长沙.NET技术社区筹建过程中,溪源有幸认识来自上海的MVP汪宇杰Edi Wang.在中国众多的微软MVP中,Edi Wang作为一名九零后,也是一位年轻而充满才气的开发者,或许他或许外 ...