Oracle函数——日期函数

article/2025/9/26 21:59:05

        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(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual; 
结果:

1.3、求某天是星期几:

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之间的对应关系。
3.1、select to_timestamp('01-5月-18 07.46.41.000000000 上午','dd-MON-yy hh:mi:ss.ff AM') from dual;
结果:
3.2、date型转成timestamp:
select cast(sysdate as timestamp) date_to_timestamp from dual;
4、TO_TIMESTAMP_TZ(char[fmt[,’nls_param’]])函数:将符合特定日期和时间格式的字符串转变为TIMESTAMP WITH TIME ZONE类型。
Select TO_TIMESTAMP_TZ('2018-05-14','yyyy-mm-dd') from dual;
结果:

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值。
Select from_tz(timestamp '2018-05-14 12:00:00','8:00')from dual;

结果:

7、TZ_OFFSET(time_zone_name||sessiontimezone||dbtimezone):返回特定时区与UTC相比的时区偏移。
Select TZ_OFFSET ('EST') from dual;
结果:
8、SYS_EXTRACT_UTC(timestamp)函数:将一个timestamptz转换成UTC时区的本地时间
Select SYS_EXTRACT_UTC(timestamp'2018-05-14 12:00:00 +08:00') from dual;
结果:
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 SYSDATE,add_months(SYSDATE,-2),add_months(sysdate,2) from dual;
结果:

11、floor函数:计算两个日期间的天数
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

18、NEXT_DAY(d,string)函数:准确来说一个礼拜是从星期日开始到星期六结束的。例如next_day(sysdate,6)是从当前开始下一个星期五。很多的查询条件和统计都需要求得一周的时间段,也就是星期一到星期日的时间段。给出日期d和星期string之后计算下一个星期的日期. String是星期几;当前会话的语言指定了一周中的某一天.返回值的时间分量与d的时间分量是相同的. String的内容可以忽略大小写.
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)) mSecondsfrom (select trunc(sysdate) Days, sysdate - trunc(sysdate) A from dual)

结果:

22、组合用法:
22.1、根据某一天具体日期,查找该日为星期几,并得到星期一和星期日具体日期

方式一:使用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 rnumfrom all_objectswhere 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_MonthFROM 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_dayfrom (select substr('2018-2', 1, 4) yy, to_number(substr('2018-2', 6)) wwfrom 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_dayfrom (select (to_date('201801', 'yyyymm') + rownum-1) v_datefrom all_tableswhere 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_dayfrom (select substr('2018-02', 1, 4) yy, to_number(substr('2018-02', 6)) wwfrom 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_dayfrom (select (to_date('201801', 'yyyymm') + rownum-1) v_datefrom all_tableswhere rownum < 370)where to_char(v_date, 'yyyy-iw') = '2018-02';


22.8、查询某周的日期

一、

select v_date,to_char( v_date, 'day') dayfrom (select (to_date('201801', 'yyyymm') + rownum - 1) v_datefrom all_tableswhere rownum < 370)where to_char(v_date, 'yyyy-ww') = '2018-01';
二、
select min_date, to_char(min_date, 'day') dayfrom (select to_date(substr('2018-01', 1, 4) || '001' + rownum - 1,'yyyyddd') min_datefrom all_tableswhere rownum <= decode(mod(to_number(substr('2018-01', 1, 4)), 4),0,366,365)unionselect 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_datefrom all_tableswhere rownum <= 7unionselect to_date(substr('2018-01', 1, 4) + 1 || '001' + rownum - 1,'yyyyddd') min_datefrom all_tableswhere rownum <= 7)where to_char(min_date, 'yyyy-ww') = '2018-01';
结果:

http://chatgpt.dhexx.cn/article/CMAVxRYm.shtml

相关文章

回归问题的评价指标

回归问题的评价指标有很多&#xff0c;这里一一进行详细分类&#xff1a; 点对点误差 MSE均方误差 MSE(Mean Square Error)&#xff1a; 均方误差描述了样本真实值与预测值差方求和的平均值&#xff0c;在机器学习中&#xff0c;利用均方误差最小化优化模型的方法称…

区分回归问题和分类问题

回归问题和分类问题的区别 回归问题 用一个经典的问题来解释&#xff1a;假设你想买房子&#xff0c;手头上仅有的是之前出售的房子的占地面积大小和房子的价格&#xff0c;你想凭借手头上的这些数据来买一套不错的房子&#xff0c;那么你仅有的关于房子的信息是房子的占地大小…

LSTM回归问题

LSTM 解决回归问题时&#xff0c;出现了 model.predict() 输出的值几乎是常数值的问题&#xff0c;后来发现是因为数据没有标准化&#xff08;归一化&#xff09;&#xff0c;导致 loss 不下降&#xff0c;也就是不收敛。后来加入了数据的标准化之后&#xff0c;就可以拟合了。…

数据分析——随机森林解决回归问题

下表为训练数据集&#xff0c;特征向量只有一维&#xff0c;根据此数据表建立回归决策树。 在本数据集中&#xff0c;只有一个特征变量&#xff0c;最优切分变量自然是x。接下来考虑9个切分点{1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5}&#xff0c;根据下式计算每个待切分点的损失…

处理回归问题常见的算法

7.处理回归问题常见的算法&#xff1a; 回归属于有监督学习的一种&#xff0c;其从连续的统计数据中的到数学模型&#xff0c;然后使用生成的模型用于预测和分类。线性回归&#xff1a;给定数据集&#xff0c;其中线性回归模型通过对数据集的学习生成一个线性模型&#xff0c;…

深度学习 分类问题与回归问题

分类问题与回归问题 分类与回归 一、分类问题1.1分类性能度量&#xff1a;&#xff08;1&#xff09;准确率&#xff08;accuracy&#xff09;*&#xff08;2&#xff09;精确率&#xff08;percision&#xff09;*&#xff08;3&#xff09;召回率&#xff08;recall&#xff…

Python实现---用KNN解决回归问题

KNN用于回归问题 KNN不仅可以用于分类问题&#xff0c;也可以用回归问题。 主要算法思路就是&#xff1a;使用KNN计算某个数据点的预测值时&#xff0c;模型从训练数据集中选择离该数据点最近的k个数据点&#xff0c;并且把这些数据的y值取均值&#xff0c;把求出的这个均值作…

神经网络:DNN回归问题

2020_11_01 DNN Regression 参考资料&#xff1a;《Python深度学习》 Francois Choll 神经网络可以主要解决三大类问题&#xff1a;二分类、多分类、回归。 回归问题特点在于结果是连续值&#xff0c;因此调参过程也与分类问题相异。 在了解DNN回归问题后&#xff0c;我们…

机器学习实战(二)使用LightGBM的回归问题模型搭建

目录 1.导入所用的数据包 2.导入模型建立所需要的数据 3.数据集划分 4.导入训练包与交叉验证包&#xff08;LGBM&#xff09; 5.模型训练 6.模型验证及画图 7.画图展示模型验证情况 8.特征重要性分析 数据集链接 S. Thai, H. Thai, B. Uy, T. Ngo, M. Naser, Test Data…

Keras深度学习(4)-回归问题之预测房价

在深度学习的任务中&#xff0c;回归问题也是一个常见的任务。 本文将要预测 20 世纪 70 年代中期波士顿郊区房屋价格的中位数&#xff0c;已知当时郊区的一些数据点&#xff0c;比如犯罪率、当地房产税率等。本节用到的数据集与前面两个例子有一个有趣的区别。它包含的数据点相…

『迷你教程』绝对能看懂的分类问题和回归问题白话版

文章目录 内容介绍函数近似分类预测建模回归预测建模分类与回归在分类和回归问题之间转换 内容介绍 老生常谈的话题分类问题和回归问题之间有一个重要的区别。从根本上说&#xff0c;分类是关于预测标签&#xff0c;回归是关于预测数量。 我经常看到这样的问题&#xff1a; 如…

各类回归问题总结

回归问题的条件/前提&#xff1a; 1&#xff09; 收集的数据 2&#xff09; 假设的模型&#xff0c;即一个函数&#xff0c;这个函数里含有未知的参数&#xff0c;通过学习&#xff0c;可以估计出参数。然后利用这个模型去预测/分类新的数据。 1. 线性回归 假设 特征 和 结果…

回归问题的评价指标和重要知识点总结

回归分析为许多机器学习算法提供了坚实的基础。在这篇文章中&#xff0c;我们将总结 10 个重要的回归问题和5个重要的回归问题的评价指标。 1、线性回归的假设是什么&#xff1f; 线性回归有四个假设 线性&#xff1a;自变量&#xff08;x&#xff09;和因变量&#xff08;y…

深度学习3:回归问题

首先不要将回归问题和logistic回归算法混为一谈&#xff0c;logistic回归不是回归算法&#xff0c;而是分类算法。 之前的分类问题的目标是预测输入数据点所对应的单一离散的标签&#xff0c;而这节要预测一个连续的而不是离散的标签&#xff0c;比如根据气象数据预测明天的气温…

回归问题评价指标

目录 平均绝对值误差&#xff08;MAE&#xff09; 均方误差&#xff08;MSE&#xff09; 均方根误差&#xff08;RMSE&#xff09; 平均绝对百分比误差(MAPE) 均方误差对数(MSLE) 中位绝对误差(MedAE) R Squared 总结 回归模型&#xff1a; 个样本&#xff0c;每个样本…

stacking集成模型预测回归问题

前言 关于各种集成模型&#xff0c;已经有很多文章做了详细的原理介绍。本文不再赘述stacking的原理&#xff0c;直接通过一个案例&#xff0c;使用stacking集成模型预测回归问题。 本文通过学习一篇stacking继承学习预测分类问题&#xff0c;对其代码进行了调整&#xff0c;以…

逻辑回归问题汇总

文章目录 1. Logistic回归与线性回归的区别与联系&#xff1f;2. Logistic回归有哪些基本假设?3. Logistic回归的损失函数?4. Logistic回归损失函数的求解方法?5. Logistic回归是如何进行分类的?6. Logistic回归为什么要用极大似然函数作为损失函数&#xff1f;7. 为什么在…

回归问题归一化总结

在用深度学习做回归问题时&#xff0c;对数据进行标准化处理是一个共识&#xff0c;将数据标准化&#xff0c;利用标准化后得数据进行数据分析。不同评价指标往往具有不同的量纲和量纲单位&#xff0c;这样的情况会影响到数据分析的结果&#xff0c;为了消除指标之间的量纲影响…

分类和回归问题

前言 最近在复习一些深度学习和机器学习的基础知识&#xff0c;看到分类和回归&#xff0c;这里记录一下。 一、回归 首先&#xff0c;回归应用的场景是用来输出一系列连续的值&#xff0c;然后用于预测等任务。回归的目的是为了找到最优拟合的曲线&#xff0c;这个曲线可以…

回归问题一般解决方法

1. 回归问题 Given a labeled training set learn a general mapping which associates previously unseen independent test data with their correct continuous prediction. 回归问题和分类问题很相似,区别在于回归问题的输出是一个连续值。 上图是训练数据 和 对应的连续值…