Oracle to_date函数的用法介绍_oracle_脚本之家

ORA-00911: 无效字符

目录

1.Oracle的日子函数
2.日期加减
3.月份加减
4.年份加减
5.求每月的尾声一天
6.求每月的第一天
7.求下四个星期几

入门知识:

①Oracle中的日期时间存款和储蓄:
oracle数据库中存放时间格式的多寡,是以oracle特定的格式存贮的,占7个字节,与查询时体现的日子格式非亲非故。不存贮秒以下的光阴单位。
②Oracle中的日期时间展现:
常常,客商端与数据库创设起连年后,oracle就能够给八个缺省的年月格式数据的来得方式,与所利用的字符集有关。平日显示年月日,而不出示时分秒。
③Oracle中的日期时间插入:
向表中插入数据时,就算不接受转变函数,则时间字段的格式必得遵守会话情状的时光格式,不然不能够插入。
④Oracle中的日期时间格式修正:
a.SQL> alter
session set nls_date_format = ‘yyyy-mm-dd hh24:mi:ss’;
b.册表\hkey_local_machine\software\oracle\home0主键中追加三个字串(8i本子卡塔尔国,字串名叫nls_date_format,字串的值为您期待定义的时刻格式
前端只对如今对话有效,约等于黄金时代旦你关闭了SQL*PLUS窗口或重新张开一个SQL*PLUS窗口,日期时间格式依旧选取地方字符集对应的日申时间格式。后面一个对负有顾客端应用使得。当二者同有时候选取时,以alter
session的改良为准。

豆蔻梢头、Oracle的日期函数:

Oracle从8i起来就提供了多量的日子函数,那些日子函数包涵对日期实行加减、调换、截取等功用。下边是Oracle提供的日子函数一览表 

Function

Use

ADD_MONTHS

Adds months to a date

LAST_DAY

Computes the last day of the month

MONTHS_BETWEEN

Determines the number of months between two dates

NEW_TIME

Translates a time to a new time zone

NEXT_DAY

Returns the date of the next specified weekday

ROUND

Rounds a date/time value to a specified element

SYSDATE

Returns the current date and time

TO_CHAR

Converts dates to strings

TO_DATE

Converts strings and numbers to dates

TRUNC

Truncates a date/time value to a specific element

二、日期加减:

在Oralce中,对日期进行加减操作的暗中同意单位是天,也正是说如果大家向当前些天子加1的话是拉长一天,实际不是生机勃勃秒或半小时。那么对黄金时代午月的黄金时代段时间进行加减要如何是好吗?超粗略!只需将它们转变为以天为单位即可。

【1】为日前不久子增进30分钟:

图片 1SQL> select to_char(sysdate, ‘yyyy-mm-dd hh:mi:ss’) now_date,
图片 2  2             to_char(sysdate+(30/24/60), ‘yyyy-mm-dd hh:mi:ss’) new_date
图片 3  3    from dual;
图片 4
图片 5NOW_DATE                               NEW_DATE
图片 6————————————– ————————————–
图片 720080630 10:47:31                    20080630 11:17:31
图片 8
图片 9SQL> 

咱俩看出了在血牙红高亮处采纳30/24/60将分钟转变整日。别的贰个要介意之处是:SQL*PLUS景况下默许的日期格式:NLS_DATE_FORMAT是DD-MM-YYYY,也等于不含有的时候、分、秒,所以我们那边不可不使用to_char的方法内定输入的日子格式。

除却也能够透过在SQL*PLUS中推行下列语句更改暗中同意的日子输出格式,那样的话就无需经过to_char来退换了,直接出口就行。

图片 10alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’;

【2】为当下光阴压缩30分钟:

图片 11SQL> select to_char(sysdate+(-30/24/60),’yyyy-mm-dd hh:mi:ss’) new_date from dual;
图片 12
图片 13NEW_DATE
图片 14————————————–
图片 1520080630 10:24:59

只供给增加一个负数即能够了。

三、月份加减:

月份的加减和日期加减相比要难了数不胜数,因为种种月份的造化并不是定位的,只怕是31,30,29,28。假设应用地点的办法将月份转变到实际天数将不可制止地面世四个推断,幸好Oracle为大家提供了叁个add_months函数,那些函数会自动剖断月份的大运。看看上面包车型地铁例证:

【1】为当下时刻累计7个月:

图片 16SQL> select add_months(sysdate, 6) from dual;
图片 17
图片 18ADD_MONTHS
图片 19———-
图片 2031-12月-08

【2】为近年来时间减去八个月:

图片 21SQL> select add_months(sysdate, –6) from dual;
图片 22
图片 23ADD_MONTHS
图片 24———-
图片 2531-12月-07

【3】求八个日子相差的月数:

平日性处境下七个时刻相减将得到以天数为单位的结果,然而不常候我们更希望赢得以月为单位的结果,假设手动转变那太费力了,所以Oracle又提供了二个函数,这么些函数便是months_between。

图片 26SQL> select months_between(sysdate,
图片 27  2         to_date(‘2008-01-01 01:00:00’, ‘yyyy-mm-dd hh:mi:ss’)) result
图片 28  3    from dual;
图片 29
图片 30    RESULT
图片 31———-
图片 325.94928203

months_between函数有2个参数,第多个参数是终止日期,第二个参数是初叶日期,Oracle用第一个参数减去第叁个参数获得月份数。所以结果有不小可能率会是负数的。

四、年份加减:

Oracle并不直接提供对年度举办加减的函数,然则有了add_months和months_between函数,大家依旧能够做到。

【1】为当下日子加上2年:

图片 33SQL> select add_months(sysdate, 2*12) two_years_later
图片 34  2      from dual;
图片 35
图片 36TWO_YEARS_
图片 37———-
图片 3830-6月 –10

【2】求七个日子相差几年:

图片 39SQL> select months_between(sysdate, 
图片 40  2         to_date(‘2006-06-30’, ‘yyyy-mm-dd’)) / 12 years_between
图片 41  3    from dual;
图片 42
图片 43YEARS_BETWEEN
图片 44————-
图片 45            2

一贯将多个日子相减,然后除以365天并不确切,可是不管一年有些许天它总是只有1三个月,所以使用那一点大家得以先求出五个日子相差的月数,再除以12就得出相差的年数了

五、求每月的结尾一天:

图片 46SQL> select last_day(add_months(sysdate,2)) last_day
图片 47  2    from dual;
图片 48
图片 49LAST_DAY
图片 50———-
图片 5131-8月 –08

六、求每月的首后天:

Oracle提供了last_day让大家可以求出所在月份的终极一天,但向来不对症用药的first_day函数,尽管有那方面包车型大巴要求,只必要多少动一下脑筋,利用last_day函数就可以。举个例子下边包车型地铁SQL语句正是求出上个月的首后天:

图片 52SQL> select last_day(sysdate)+1 fisrt_day
图片 53  2      from dual;
图片 54
图片 55FISRT_DAY
图片 56———-
图片 5701-7月 –08

在此大家将“每月的率后天”转变到“后一个月最终一天的下一天”,难点就缓慢解决了!

七、求下贰个星期几:

不经常大家会碰撞“下个星期一是几号啊?”那样大范围的标题。Oracle为此提供了叁个函数:next_day,它的语法是如此的:next_day(date,
string卡塔尔。此中第一个参数date告诉Oracle从哪天开首算起,首个参数string则告知Oracle要取的专门的工作日。

上面大家看看哪些收获下个星期四的日期:

图片 58SQL> select next_day(sysdate, ‘Friday’) “Next Friday” from dual;
图片 59select next_day(sysdate, ‘Friday’) “Next Friday” from dual
图片 60                         *
图片 61ERROR at line 1:
图片 62ORA-01846: 周中的日无效

很意外!是不?明明语法没不时常,但为什么会说“周中的日无效”呢?这里就一定要谈到Oracle中的语言和时区的主题素材了。上边那张图是运用TOAD截收取来的客户端session的语言和时区音信:

图片 63
图一

从图中大家知晓了顾客端的言语是简体普通话,日期使用的语言也是简体中文,那就是为啥上边的SQL语句出错的案由了,因为在中文言中独有“礼拜三,星期二”那样的职业日表示,而从不“Monday,Firday”那样的写法!

图片 64SQL> select next_day(sysdate,’星期五’) “下周五” from dual;
图片 65
图片 66下周五
图片 67———-
图片 6804-7月 –08

要是你不鲜明自身的时区或许您忧虑从二个时区移植到另一个时区时,SQL语句会出错,Oracle还同意你用数字的方式来表示职业日。然而要记得一点:1象征的是周末,2代表的是周生龙活虎,3代表的是周五,就那样推算。

例如我要查下个星期三是何等时候,则函数是那样写的:next_day(sysdate,
4)。

图片 69SQL> select next_day(sysdate,4) from dual;
图片 70
图片 71NEXT_DAY(S
图片 72———-
图片 7302-7月 –08

图片 74

看一下日历是否道理当然是那样的的,确实准确!呵呵

如:原因是SQL中不区分轻重缓急写,MM和mm被以为是相像的格式代码,所以Oracle的SQL采纳了mi替代分钟。

 ///  /// 得到第一行第一列的值 ///  ///  ///  public object ScalarBySQL { ISession sess = ActiveRecordMediator.GetSessionFactoryHolder().CreateSession(typeof; IDbConnection dbconn = sess.Connection; try { IDbCommand dbCommand = dbconn.CreateCommand(); dbCommand.CommandText = sqlstr; object thisReader = dbCommand.ExecuteScalar(); return thisReader; } catch  { LogInfo.Error; throw new Exception; } finally { dbconn.Close(); } }

select to_char(sysdate,’yyyy-MM-dd HH24:mi:ss’) from
dual;//mi是分钟select to_char(sysdate,’yyyy-MM-dd HH24:mm:ss’卡塔尔(قطر‎ from
dual;//mm会突显月份

典型in中的数占有节制,不然ORA-01795: 列表中的最大表达式数为 1000

5.oracle有皮秒级的数据类型

DB2获取的艺术

select to_date(‘2005-01-01 13:14:20′,’yyyy-MM-dd HH24:mm:ss’) from
dual;

由于系统底层使用的是ORM映射工具,由于并未有动用存款和储蓄进程,自定义函数,触发器,由此笔者觉着系统改造十分小,但开掘的问题却游人如织。

实际用法和地点的to_char差不多。

select seq_SequenceName.nextval from
dual2我们底层采纳的是ORM映射工具ActiveRecord,开采实践SQL时语句末尾不能够有分店,太奇怪了。这几个难点仿佛是ActiveRecord自己的主题素材

参照oracle的相关关文书档案(ORACLE901DOC/SEHighlanderVE奥迪Q5.901/A90125/SQL_ELEMENTS4.HTM#48515)

包罗小时的日期格式处理24钟头

  • interval ‘7’ month from dual 当前时光减去7年的时日 select
    sysdate,sysdate – interval ‘7’ year from dual 时间间隔乘以一个数字
    select sysdate,sysdate – 8 *interval ‘2’ hour from dual

    select sysdate,to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual select sysdate,to_char(sysdate,’yyyy-mm-dd hh:mi:ss’) from dual select sysdate,to_char(sysdate,’yyyy-ddd hh:mi:ss’) from dual select sysdate,to_char(sysdate,’yyyy-mm iw-d hh:mi:ss’) from dual

create view ViewNameasselect a.HWD_User_FK,b.u_name from T_HRWxData as a join T_user as b on a.HWD_User_FK=b.u_id如上的SQL在Server SQL,DB2中都可以使用,但在Oracle中不能使用,需要把as去掉create view ViewNameasselect a.HWD_User_FK,b.u_name from T_HRWxData a join T_user b on a.HWD_User_FK=b.u_id

二、另要以24钟头的花样体现出来要用HH24

如上那篇DB2数据库切换为oracle数据库经验教导总括就是笔者共享给我们的全体内容了,希望能给大家贰个参阅,也希望我们多多支持脚本之家。

--返回当前时间 年月日小时分秒毫秒 select to_char,'DD-MON-YYYY HH24:MI:SSxFF') from dual; --返回当前 时间的秒毫秒,可以指定秒后面的精度 select to_char,'MI:SSxFF') from dual;

那多少个函数YEALAND,MONTH,DAY未有

select to_date(‘2003-10-17 21:15:37′,’yyyy-mm-dd hh24:mi:ss’) from dual