oracle sql 日期比较,oracle 日期 比较
共三部分:
第一部分:oracle sql日期比较:
http://www。博客Java。net/forker/archive/2007/09/07/143467。html #帖子
第二部分:甲骨文获取当前日期及日期格式
http://blog.sina.com.cn/s/blog_6168ee920100l2ye.html
第三部分:
获取昨天:
从双数中选择trunc(系统日期-1);
检查一下:
select to_char (trunc(SYSDATE-1), yyyy-mm-DD HH24:MI:SS )from dual;
获取上个月第一天00:00:00:
select add_months(trunc(sysdate, MON ),-1 from dual
select add_months(trunc(sysdate, MON ),-13 from dual也可以
获取上个月今天00:00:00:
SELECT trunc(add_months(sysdate,-1))FROM dual
获得本季度第一天
从双数中选择TRUNC(添加月份(系统日期,0), Q )
获得上季度第一天
从双数中选择TRUNC(添加月份(系统日期,-3), Q )
获得去年一月一日
to _ char(add _ months(trunc(sysdate, Year ),-12), YYYY-MM-DD )
在……和……之间前面的时间小后面的时间大
截止日期( 20110105 , YYYYMMDD)-7此处-7代表天
第四部分:
神谕时间函数(转)http://www。。com/xd 502 djj/archive/2010/08/24/1807565。超文本标记语言
第一部分:oracle sql日期比较:
数据库日期比较:
在今天之前:
select * from up _ date where update to _ date( 2007-09-0700:00:00 , yyyy-mm-ddhh24:mi:ss )
select * from up _ date其中update=to _ date( 2007-09-0700:00:00 , yyyy-mm-ddhh24:mi:ss )
在今天之后:
select * from up _ date where update to _ date( 2007-09-0700:00:00 , yyyy-mm-ddhh24:mi:ss )
select * from up _ date其中update=to _ date( 2007-09-0700:00:00 , yyyy-mm-ddhh24:mi:ss )
精确时间:
select * from up _ date其中update=to _ date( 2007-09-0700:00:00 , yyyy-mm-ddhh24:mi:ss )
在某段时间内:
select * from up _ date where update between to _ date( 2007-07-0700:00:00 , yyyy-mm-ddhh24:mi:ss )和截止日期( 2007-09-0700:00:00 , yyyy-mm-ddhh24:mi:ss )
select * from up _ date where update to _ date( 2007-09-0700:00:00 , yyyy-mm-ddhh24:mi:ss )和更新到日期( 2007-07-0700:00:00 , yyyy-mm-ddhh24:mi:ss )
select * from up _ date其中update=to _ date( 2007-09-0700:00:00 , yyyy-mm-ddhh24:mi:ss )和update=to _ date( 2007-07-0700:00:00 , yyyy-mm-ddhh 24:mi:ss )格式化日期输出格式:
to_char(w.sample_time, yyyy-mm-dd )
第二部分:甲骨文获取当前日期及日期格式
神谕获取当前日期及日期格式
获取系统日期:系统日期()
格式化日期:TO_CHAR(SYSDATE(), YY/月/日HH24:MI:SS)
或TO_DATE(SYSDATE(), YY/月/日HH24:MI:SS)
格式化数字:收件人号码
注:收件人_字符把日期或数字转换为字符串
TO_CHAR(数字,格式)
TO_CHAR(薪水,$99999.99 )
TO_CHAR(日期,格式)
截止日期把字符串转换为数据库中的日期类型
到目前为止(字符格式)
收件人号码将字符串转换为数字
收件人号码(字符,格式)
返回系统日期,输出25-12月-09
从双数中选择系统日期
大音阶的第三音是分钟,输出2009-12-25 14:23:31
select to_char(sysdate, yyyy-MM-DD HH24:mi:ss )from dual;
毫米会显示月份,输出2009-12-25 14:12:31
select to_char(sysdate, yyyy-MM-DD HH24:MM:ss )from dual;
输出09-12-25 14:23:31
select to_char(sysdate, yy-mm-dd hh24:mi:ss) from dual
输出2009-12-25 14:23:31
select to _ date( 2009-12-25 14:23:31 , yyyy-mm-dd,hh24:mi:ss) from dual
而如果把上式写作:
select to _ date( 2009-12-25 14:23:31 , yyyy-mm-dd,hh:mi:ss) from dual
则会报错,因为小时倍硬是12进制,14为非法输入,不能匹配。
输出$10,000,00 :
select to_char(1000000, $99,999,99 )from dual;
输出人民币10,000,00元:
从双数中选择to_char(1000000, L99,999,99 );
输出1000000.12 :
select trunc(to _ number( 1000000.123 ),2)from dual;
从双数中选择to _ number( 1000000.123 );
转换的格式:
表示年的:y表示年的最后一位、
尤尼克斯表示年的最后2位、
yyy表示年的最后3位、
年份用四位数表示年
表示月的:嗯用2位数字表示月、
孟族人用简写形式,比如11月或者11月,
月用全称,比如11月或者十一月
表示天的:dd表示当月第几天、
ddd表示当年第几天、
镝当周第几天,简写,比如星期五或者星期五,
星期几,全名,例如星期五或星期五
小时:hh2位数代表十进制中的小时,
HH24两位数代表24小时。
分钟:mi 2位数字代表分钟
秒:ss 2数字以十六进制表示秒。
季度:Q一位数表示季度(1-4)
此外,ww用于表示一年中的第几周,W用于表示一个月中的第几周。
24小时制下的时间范围:00: 00-23: 59: 59
2小时制下的时间范围:1: 00: 00-12: 59: 59
数字格式:9代表一个数字。
0强制显示0
$放置一个$符号。
我放了一个浮动的本地货币符号。显示小数点
,显示千位指示器。
补充:
从当前时间减去7分钟。
select sysdate,sysdate -从dual间隔 7 分钟。
当前时间减去7小时。
从dual中选择sysdate-interval“7”小时;
当前时间减去7天。
从dual中选择sysdate-interval“7”天;
当前时间减去七月的时间。
从dual中选择sysdate,sysdate - interval 7 月。
当前时间减去7年。
从dual中选择sysdate,sysdate - interval 7 年。
时间间隔乘以一个数字
select sysdate,sysdate - 8*interval 7 小时from dual。
含义:
双重伪列
Dual是Oracle中的一个实际表,任何用户都可以读取它。它通常用在没有目标表的select语句块中。
不同的系统可能以不同的格式返回日期。
返回当前连接的用户:从dual中选择用户;
第四部分:
oracle时间函数(transition)常用的时间格式在Oracle中是yyyy-mm-dd hh24:mi:ss,但在Java中有些区别是yyyy-MM-dd HH:mm:ss,这往往容易模糊。
相信很多人都有过统计一些数据的经历。比如统计财务状况,可能需要每年、每季度、每月甚至每周分别统计。那如何在oracle中写sql语句呢?这时候甲骨文的日期功能会给我们很多帮助。
常用日期函数
1。系统日期当前日期和时间
SQL Selectsysdatefromdual
系统日期
-
一月至六月至五月
2。这个月的最后一天
SQL select last _ day(sysdate)from dual;
最后一天
-
2005年6月30日
3。Add_months(d,n)将当前日期d向后推n个月。
用于在日期值中加上或减去月份。
日期值:=添加月数(日期值,月数)
SQL Selectadd_months(sysdate,2)fromdual。
添加_月份
-
一月至八月至五月
4。Months_between(f,s)日期f和s之间的月差
SQL select months _ between(sysdate,to_date(2005-11-12 , yyyy-mm-dd))fromdual。
MONTHS_BETWEEN(SYSDATE,TO_DATE(2005-11-12 , YYYY-MM-DD ))
-
-4.6966741
5。下一天(d,星期几)
返回由名为“星期几”的变量“d”指定的日期之后的第一个工作日的日期。参数“星期几”必须是星期几。
SQL select next _ day(to _ date( 2005 06 20 , YYYYMMDD ),1)from dual;
第二天(T
-
六月-六月-五月
6。Current_date()返回当前会话时区中的当前日期。
日期值:=当前日期
SQL columnsessiontimezonefora15
SQL selectsessiontimezone,current _ datefromdual
SESSIONTIMEZONECURRENT_DA
-
2003年11月8日
SQL altersessionsettime _ zone=-11:00 2/
会话已更改。
SQL selectsessiontimezone,current_timestampfromdual。
SESSIONTIMEZONECURRENT _时间戳
-
-11月12日上午11点至下午11点
7。Current_timestamp()返回当前会话时区中的当前日期,数据类型为timestampwithtimezone。
SQL select current _ timestampfromdual;
当前时间戳
-
20589年6月21日上午8时
8。Dbzone()返回dbtimezone
SQL selectdbtimezonefromdual
DBTIME
-
-08:00
9。Extract()查找日期或间隔值的字段值。
日期值:=extract(日期字段来自[日期时间值间隔值])
SQL select extract(monthfromsysdate)“this month”from dual;
这个月
-
六
SQL select extract(yearfromadd _ months(sysdate,36)) Years from dual;
年
-
2008
10。Localtimestamp()返回会话中的日期和时间。
SQL selectlocaltimestampfromdual:
本地时间戳(本地时间戳)
-
6月21日月-0510.18.15.855652上午
常用日期数据格式(该段为摘抄)
然后呢或尤尼克斯是吗或YYY版年的最后一位,两位或三位Selectto_char(sysdate, yyy )from double;002表示2002年
锡耶纳或年复一年使公元前的年份前加一负号Selectto_char(sysdate, syear )from double;1112年表示公元前1112年
问季度,1~3月为第一季度Selectto_char(sysdate, q )from double;2表示第二季度S7-1200可编程控制器
嗯,嗯月份数Selectto_char(sysdate, mm )from double;12表示12月
RM(消歧义)月份的罗马表示Selectto_char(sysdate, RM )from double;四、导言表示四月
月份(月)用9个字符长度表示的月份名selected _ char(sysdate, month )from double:梅五月后跟6个空格表示5月
WWE(消歧义)当年第几周Selectto_char(sysdate, ww )from double;24表示2002年6月13日为第24周
w代表本月第几周Selectto_char(sysdate, w )from double;2002年10月一日为第一周
DDD(数字量输入)当年第几,1月一日为001.2月一日为032 selected _ char(sysdate, DDD )from double;3632002年12月29日为第363天
DD(消歧义)当月第几天Selectto_char(sysdate, DD )from double;0410月四日为第四天
d。非政府组织周内第几天Selectto_char(sysdate, d )from double;52002年3月14日为星期一
-好的周内第几天缩写Selectto_char(sysdate, dy )from double;2002年太阳年3月24日为星期天
HH!你好或HH1212号进制小时数Selectto_char(sysdate, hh )from double;02午夜2点过8分为02
HH2424号小时制Selectto_char(sysdate, hh24 )from double;14下午2点08分为14
我吗分钟数(0 ~ 59)selected _ char(sysdate, mi )from double;17下午四点17分
圣人是秒数(0 ~ 59)selected _ char(sysdate, ss )from double;2211点3分22秒
提示注意不要将嗯,嗯格式用于分钟(分钟应该使用(我)。嗯,嗯是用于月份的格式,将它用于分钟也能工作,但结果是错误的。
现在给出一些实践后的用法:
一个。上月末天:
SQL selected _ char(add _ months(last _ day(sysdate),-1), yyyy-MM-dd)LastDayfrom
双重的;
最后一天(负荷日)
-
2005年5月31日
2个。上月今天
SQL selected _ char(add _ months(sysdate,-1), yyyy-mm-DD )pretodyfromdual;
今天之前先生
-
2005年5月21日
3.上月首天
SQL selected _ char(add _ months(last _ day(sysdate)1,-2), yyyy-mm-DD )第一天dayfromdual
第一天
-
2005年5月一日
4.按照每周进行统计
SQL selectto_char(sysdate, ww )from dual group by to _ char(sysdate, ww );
来了
-
25
5个。按照每月进行统计
SQL selected _ char(sysdate, mm )from dual group by to _ char(sysdate, mm );
来了
-
06
6个。按照每季度进行统计
SQL selected _ char(sysdate, q )from dual group byto _ char(sysdate, q );
相当于-ED
-
2
七个。按照每年进行统计
SQL selectto_char(sysdate, yyyy )from dual group by to _ char(sysdate, yyyy );
至_C
-
2005
8.要找到某月中所有周五的具体日期
selectto_char(t.d, YY-MM-DD)from(
selecttruc(sysdate, MM) rownum-1asd
来自数据库管理员对象-来自数据库管理员物件
惠灵顿:(32)吨
whereto_char(t.d, MM)=to_char(sysdate, MM) -找出当前月份的周五的日期
圆框(to_char(t.d。天)=”星期五我不知道
-
02年5月3日
09年5月3日
2005年5月3日至16日
2005年5月3日至23日
2005年5月3日至30日
如果把whereto_char(t.d, MM)=to_char(sysdate, MM ).改成sysdate-90,即为查找当前月份的前三个月中的每周五的日期。
9 .甲骨文中时间运算
内容如下:
1、甲骨文支持对日期进行运算
2 ._日期运算时是以天为单位进行的
{ 1 }当需要以分秒等更小的单位算值时,按时间进制进行转换即可
4 ."进行时间进制转换时注意加括号,否则会出问题
SQL age会话set nls _ date _ format= yyyy-mm-ddhh:mi:ss ;
会话已更改。
SQL setserverouton
SQL声明-SQL宣告
2日期值日期
3开始
4 selectsysfiletodatevaluefromdual;
5dbms_output.put_line(源时间* to _ char(日期值));
6dbms_output.put_line(源时间减一天* to _ char(日期值-1));
7dbms_output.put_line(源时间减一天一小时* to _ char(日期值-1-1/24));
8dbms_output.put_line(源时间减一天一小时一分* to _ char(日期值-1-1/24-1/(24 * 60));
9dbms_output.put_line(源时间减去一天一小时一分一秒: to _ char(datevalue-1-1/24-1/(24 * 60)-1/(24 * 60 * 60)));
10end
11/
资料来源:2003年12月-2011年:53: 41
源时间减少1天:2003年12月-2811: 53: 41
源时间减少1天1小时:2003年12月-2810: 53: 41
源时间减去1天1小时1分钟:2003-12-2810:52:41
源时间减少1天1小时1分1秒:2003年12月-2810: 52: 40
PL/SQL进程已成功完成。
Oracle中时间添加处理的实现
-名称:添加次数
-函数:返回d1和NewTime相加后的结果,实现时间的相加。
-注意:不考虑NewTime中的日期。
-日期:2004年12月7日
-版本:1.0
-作者:凯文
createorreplacefunctionAdd _ Times(D1 in date,NewTimeindate)returndate
存在
hhnumber
mmnumber
ssnumber
小时数;
dResultdate
开始
-在下面依次取出小时、分钟和秒。
select to _ number(to _ char(new time, HH24 ))intohhfromdual;
select to _ number(to _ char(new time, MI ))intommfromdual;
select to _ number(to _ char(new time, SS ))intossfromdual;
-将小时数转换为新时间,它占一天的百分比是多少?
小时数:=(hh(mm/60)(ss/3600))/24;
-加时间后得到结果。
选择hoursintodResultfromdual
返回(d result);
endAdd _ Times
-测试案例
- selectAdd_Times(sysdate,to_date(2004-12-0603:23:00 , YYYY-MM-ddhh 24:MI:SS ))from dual
在Oracle9i中计算时差
计算时差是OracleDATA数据类型的常见问题。Oracle支持日期计算。您可以创建“日期1-日期2”这样的表达式来计算这两个日期之间的时差。
一旦你找到了时差,你就可以用简单的技巧来计算时差,以天、小时、分钟或秒为单位。为了得到数据差异,你必须选择合适的时间测量单位,这样你就可以隐藏数据格式。
使用复杂的转换函数来转换日期是一种诱惑,但是您会发现这不是最佳的解决方案。
round(to _ number(end-date-start _ date))-经过的时间(以天为单位)
round(to _ number(end-date-start _ date)* 24)-已用时间(小时)
round(to _ number(end-date-start _ date)* 1440)-经过的时间(分钟)
显示时差的默认模式是什么?为了找到这个问题的答案,让我们做一个简单的SQL*Plus查询。
SQL select sysdate-(sysdate-3)from dual;
系统日期-(系统日期-3)
-
三
在这里,我们看到Oracle使用天数作为运行时间的单位,因此我们可以很容易地使用转换函数将其转换为小时或分钟。但是当分钟数不是整数时,我们会遇到小数点的放置问题。
挑选
(系统日期-(系统日期-3.111))*1440
从
对偶;
(系统日期-(系统日期-3.111))*1440
-
4479.83333
当然,我们可以使用ROUND函数(也就是rounding函数)来解决这个问题,但是要记住,我们必须首先将DATE数据类型转换为NUMBER数据类型。
挑选
round(to _ number(sysdate-(sysdate-3.111))* 1440)
从
对偶;
ROUND(TO _ NUMBER(SYSDATE-(SYSDATE-3.111))* 1440)
-
4480
我们可以使用这些函数将经过的时间近似转换成时钟,并将这个值写入Oracle表中。在这个例子中,我们有一个离线(注销)系统级触发机制来计算启动的会话时间,并将其放在一个OracleSTATSPACKUSER_LOG扩展表中。
更新
perfstat.stats$user_log
设置
已用分钟数=
round(收件人号码(注销时间-登录时间)*1440)
在哪里
用户=用户标识
和
elapsed _ minutesisNULL
找出任何一年中包含的工作日。
CREATEORREPLACEFUNCTIONGet _ working days(
nyINVARCHAR2
)返回整数
/* -
函数名:Get_WorkingDays
英文名:某月有几个工作日?
作者:邢平
编制时间:2004年5月22日
输入:NY:包含工作日数的年和月。格式为yyyymm,如200405。
返回值:整数值,包括工作天数。
算法描述:
1).列出参数给定的年份和月份中的每一天。这里用了一个表(ljrq是我库中的一个表。该表可以是任何具有access和至少31条记录的表或视图)。
2).从已知的一周中的某一天减去这些日期(2001年12月30日是星期天),然后取模7。如果日期在2001年12月30日之前,则差值为负数,模块计算后得到的值的范围大于-6小于0。比如-1表示星期六,那么在模计算的结果上加7,然后计算7的模。
3).筛选出结果集中值为0和6的元素,然后计算计数。结果就是工作天数。
- */
结果整数;
开始
选择计数(*)进入结果
FROM(select MOD(MOD(q . rq-to _ date( 2001-12-30 , yyyy-mm-dd ),7),7)工作日
FROM(SELECTto_date(nyt.dd, yyyymmdd)rq
FROM(SELECTsubstr(100 ROWNUM,2,2)dd
FROMljrqzWHERERownum=31
)t
WHEREto_date(nyt.dd, yyyymmdd )
BETWEENto_date(纽约, yyyymm )
和最后一天(截止日期(ny, yyyymm ))
)问
)a
where . weekdaynotin(0,6);
返回结果;
ENDGet _ WorkingDays
______________________________________
还有一个版本。
CREATEORREPLACEFUNCTIONGet _ working days(
nyINVARCHAR2
)返回整数
/* -
函数名:Get_WorkingDays
英文名:某月有几个工作日?
作者:邢平
编制时间:2004年5月23日
输入:NY:包含工作日数的年和月。格式为yyyymm,如200405。
返回值:整数值,包括工作天数。
算法说明:使用Last_day函数计算参数给定的年和月包含多少天,根据这个值构造一个循环。在这个循环中,首先找出这个月的每一天与星期天(2001年12月30日,星期日)之间的差异,然后取模7。如果请求的日期在2001年12月30日之前,则差值为负,模块计算后获得的值的范围大于-6且小于0。比如-1表示星期六,那么先把7加到模计算的结果上,再计算7的模。如果得到的值不等于0和6(即不是周六周日),则计为工作日。
- */
结果整数:=0;
mytsINTEGER-给定年份和月份中的天数。
sctsINTEGER-从某一天到2001年12月30日之间的天数。
rqDATE
djtINTEGER:=1;-
开始
myts:=to _ char(last _ day(to _ date(ny, yyyymm ), DD );
环
rq:=TO_date(nysubstr(100 djt,2), yyyymmdd );
scts:=rq-to_date(2001-12-30 , yyyy-mm-DD );
IFMOD(MOD(scts,7) 7,7)NOTIN(0,6)THEN
结果:=结果1;
ENDIF
djt:=djt 1;
EXITWHENdjt myts
结束循环;
返回结果;
ENDGet _ WorkingDays
以上两个版本的比较
在第一个版本中,一条SQL语句就可以得到结果,不需要编程就可以达到目的。但是,您需要使用任何具有access和至少31条记录的表或视图。
第二个版本需要编程,但不需要表或视图。
两个版本都还有待改进,就是没有考虑节日,比如五一,十一,元旦,春节。这些节假日要维护在一个表中,然后通过查表就可以把这些节假日去掉。