精华内容
下载资源
问答
  • 工作要用到 Oracle 9i,经常要向其中的某张表插入事件发生的日期及时间。专门就 Oracle 的日期及时间显示方式和插入方式记一笔。 像 Number,varchar2 等内置的数据类型一样,Oracle 用 Date 这个内置的数据...

    工作中要用到 Oracle 9i,经常要向其中的某张表插入事件发生的日期及时间。专门就 Oracle 的日期及时间显示方式和插入方式记一笔。

    像 Number,varchar2 等内置的数据类型一样,Oracle 用 Date 这个内置的数据类型来存储日期和时间。和 MS SQL Server 一样,日期和时间是存储在一个数据类型里的,没有只存储时间或只存储日期的单独的时间和日期数据类型。DATE 数据类型存储年月日和时分秒。

    当显示 DATE 类型的数据时,Oracle 先要把存储的值从内部保存格式转化为可输出的字符串。通常,这种转换是通过 TO_CHAR 这个函数来完成的。如果没有用 TO_CHAR 函数来指定特定的日期时间格式,Oracle 默认的显示格式是“DD-MON-YY”。

    例如,我们创建了一个表 x:
    create table x(a int, b date);
    然后我们执行下面的查询语句:
    select b from x; 
    我们会看到如下结果(set head on):
    B
    ------------ 
    01-APR-08 
    (语言是英语) 
    
    或 
    
    B
    ------------- 
    01-四月 -08 
    (语言是中文)

    也就是说,每次显示 DATE 类型的数值时,Oracle 会自动调用 TO_CHAR 函数,并以默认日期显示格式为参数。我们可以显式地调用 TO_CHAR 函数,并指定自己想要的格式。例如:

    SELECT TO_CHAR(b, 'YYYY/MM/DD') AS b FROM x;

    返回的结果是:

    B
    ------------ 
    2008/04/01
    

    TO_CHAR 是个很强大的函数,可以把 Date,MLSLABEL,Number 类型的数据按指定的格式转换为 VARCHAR2 类型的数据,我们在这里只关心日期时间的转换。语法:

    TO_CHAR(d [, fmt [, 'nlsparams'] ])

    d 是 Date 类型的变量,fmt 是我们指定的日期时间格式,如果不显式指定就用 Oracle 的默认值。 fmt 里常用的跟日期时间有关的占位符如下:

    • MM 用数字表示的月份(例如,07)
    • MON 缩写的月份名称(例如,JUL)
    • MONTH 完整的月份名称(例如,JULY)
    • DD 日期(例如, 24)
    • DY 星期几的缩写(例如,FRI)
    • YYYY 用4位表示的年份(例如, 2008)
    • YY 用2位表示的年份,取年份的后两位(例如,08)
    • RR 跟 YY 类似,但两位表示的年份被近似到 1950 到 2049 这个范围里的年份,例如 06 被认为是 2006,而不是 1906
    • AM (或 PM) 上下午指示符
    • HH 12进制表示的时间(1-12)
    • HH24 24进制表示的时间(0-23)
    • MI 分钟(0-59)
    • SS 秒(0-59)

    以上讲的是利用 TO_CHAR 函数来显示 DATE 类型的数据,下面讲讲如何向表里插入一个 Date 类型的数值。这时我们要用到 TO_DATE 这个函数,把字符串表示的日期转换为 Date 类型。

    跟 Oracle 显示日期时间时会隐性调用 TO_CHAR 函数一样,当 Oracle 期望一个 Date 类型的值时,它会隐性调用 TO_DATE 函数来转换输入的字符串,依据的默认格式是“DD-MON-YY”。

    还是以我们的 x 表为例,我们可以直接输入:

    insert into x values(99, '31-may-08');

    但是,在显示时不管用什么格式都不会影响我们实际储存的数据;在插入时,单纯采用 Oracle 的默认格式就不是那么符合工作需要了,我们还是需要显式调用 TO_DATE 函数,例如:

    insert into x values(99, to_date('2008/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));

    TO_DATE 函数的语法:

    TO_DATE(char [, fmt [, 'nlsparams'] ])

    char 是表示日期和时间的字符串。fmt 的表示方法和 TO_CHAR 函数一样。

    我们前面一直提到 Oracle 默认的日期时间格式是“DD-MON-YY”,其实,我们还可以修改这个默认格式,把它改成我们需要的格式。在 SQL*plus 里面输入下面的命令:

    alter session set NLS_DATE_FORMAT='<my_format>';   ——这个改变只对当前的会话(session)有用。

    例如:

    SQL> alter   session   set   nls_date_format='yyyy-mm-dd';
    会话已更改。
    SQL> insert  into  x (b)  values('2004-08-26');
    已创建1行。

    用 Oracle 内置的函数 SYSDATE 可以返回系统当前的日期和时间,例如:
    select to_char(sysdate, 'Dy DD-Mon-YYYY HH24:MI:SS') as "Current Time" from dual;

    Two interesting things to note here:

    You can use double quotes to make names case sensitive (by default, SQL is case insensitive), or to force spaces into names. Oracle will treat everything inside the double quotes literally as a single name. In this example, if "Current Time" is not quoted, it would have been interpreted as two case insensitive names CURRENT and TIME, which would actually cause a syntax error. DUAL is built-in relation in Oracle which serves as a dummy relation to put in the FROM clause when nothing else is appropriate. For example, try "select 1+2 from dual;". Another name for the built-in function SYSDATE is CURRENT_DATE. Be aware of these special names to avoid name conflicts.


    Operations on DATE You can compare DATE values using the standard comparison operators such as =, !=, >, etc.

     

    You can subtract two DATE values, and the result is a FLOAT which is the number of days between the two DATE values. In general, the result may contain a fraction because DATE also has a time component. For obvious reasons, adding, multiplying, and dividing two DATE values are not allowed.

    You can add and subtract constants to and from a DATE value, and these numbers will be interpreted as numbers of days. For example, SYSDATE+1 will be tomorrow. You cannot multiply or divide DATE values.

    With the help of TO_CHAR, string operations can be used on DATE values as well. For example, to_char(<date>, 'DD-MON-YY') like '%JUN%' evaluates to true if <date> is in June.  

    展开全文
  • 做小程序的时候,经理让创建基于时间的分区,由于以前没弄过,所以做起来做的磕磕碰碰的。现在总结下: 首先需要知道的 是: Oracle分区分为四类:范围分区;列表分区;哈希分区;组合分区 ...

    在做小程序的时候,经理让创建基于时间的分区表,由于以前没弄过,所以做起来做的磕磕碰碰的。现在总结下:


    首先需要知道的 是:

    Oracle分区表分为四类:范围分区表;列表分区表;哈希分区表;组合分区表

    范围分区表

    创建一个按字段数据范围分区的表,分区置于指定的不同表空间中

    可以先创建一些分区,然后在把表和分区结合,也可以直接在创建表的时候结合分区名(分区会自动创建),我是直接创建的表然后结合的分区名:

    CREATE TABLE "JMTDBA"."W_LOG"(
    	"GUID" VARCHAR2(64) NOT NULL ENABLE PRIMARY KEY,
    	"TYPE" CHAR(1) DEFAULT '1',
    	"REPORT_GUID" NUMBER,
    	 "CREATE_TIME" DATE )
    PARTITION BY RANGE("CREATE_TIME")
    (
    partition p1 values less than(to_date('2017-04-01 00:00:00','yyyy-mm-ddhh24:mi:ss')),
    partition p2 values less than(to_date('2017-07-01 00:00:00','yyyy-mm-ddhh24:mi:ss')),
    partition p3 values less than(to_date('2017-10-01 00:00:00','yyyy-mm-ddhh24:mi:ss')),
    partition p4 values less than(to_date('2018-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss'))
    );
    

    这样就把分区表创建好了,

    然后插入的时候用的语句:

      INSERT INTO W_LOG (
                    GUID,
                    TYPE,
                    REPORT_GUID,
                    CREATE_TIME
                )
                VALUES
                    (
                        '',
                       '',
                       '',
                        "TO_DATE" (
                            '2017-09-13 :14:23:00','yyyy-mm-dd hh24:mi:ss'
                        )
    	    )

    然后查询的话有两种,一种是在表上直接查询:

    select * from W_LOG


    另一种是在表分区上进行查询:

    select * from W_LOG
    partition(p3)

    现在表也建好了,需要在mybatis中进行添加了,

    首先是先创建一个实体类,

    package com.jmt.wx.model;
    
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * 日志实体类
     * Created by T430 on 2017/9/13.
     */
    public class WLog  implements Serializable{
        private String guid;//日志唯一标识
        private String type;//小程序类型,1,我要报警2,户政
        private long reportGuid;//登录人的标识,用登录人的userId
        private String createTime;//登录时间
    
        public String getGuid() {
            return guid;
        }
    
        public void setGuid(String guid) {
            this.guid = guid;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        public long getReportGuid() {
            return reportGuid;
        }
    
        public void setReportGuid(long reportGuid) {
            this.reportGuid = reportGuid;
        }
    
        public String getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(String createTime) {
            this.createTime = createTime;
        }
    
        @Override
        public String toString() {
            return "{" +
                    "guid:'" + guid + '\'' +
                    ", type:'" + type + '\'' +
                    ", reportGuid:'" + reportGuid + '\'' +
                    ", createTime:" + createTime +
                    '}';
        }
    }
    

    这里我先说下,创建时间不用date类型,把自己走过的坑给大家说下:因为在添加数据的时候,用的是TO_DATE('2017-10-01 00:00:00','yyyy-mm-ddhh24:mi:ss'),所以换成了String类型,方便后期转换

    下一步就是mybatis中添加日志的sql语句了:

    <!-- 添加日志  -->
        <insert id="insertLog" >
            INSERT INTO W_LOG (
                    GUID,
                    TYPE,
                    REPORT_GUID,
                    CREATE_TIME
                )
                VALUES
                    (
                        #{guid,jdbcType=VARCHAR},
                        #{type,jdbcType=VARCHAR},
                        #{reportGuid,jdbcType=BIGINT},
                        "TO_DATE" (
                            #{createTime,jdbcType=VARCHAR},'yyyy-mm-dd hh24:mi:ss'
                        )
    	    )
        </insert>

    这些写好后,就看controller里写的了

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    
    		 WLog wLog=new WLog();
                        wLog.setGuid(GUID);
                        wLog.setType(type);
                        wLog.setReportGuid(userId);
    
                        wLog.setCreateTime(sdf.format(new Date()));
    
                        logService.insertLog(wLog);
    


    这些都写好后,就可以开始运行了,下面把我成功保存的截图给大家发一下:




    插入成功!到此为止,分区表插入信息已经做完!


    每天进步一点点,多学习!!!





    展开全文
  • 今天做数据库操作的时候,有一个需求是将A表中的前500000条数据查出来,然后插入到表B中.表A与表B具有同样的字段类型,数据库为Oracle 10g,数据库管理工具用的PL\SQL,由于数据库不是特别的熟,于是网上查到如下...
    

    今天在做数据库操作的时候,有一个需求是将A表中的前500000条数据查出来,然后插入到表B中.表A与表B具有同样的字段类型,数据库为Oracle 10g,数据库管理工具用的PL\SQL,由于数据库不是特别的熟,于是在网上查到如下语法:

    insert into B select * from A  where rownum <= 500000;

    然而,我的PL\SQL工具既没有报错,插入的时间也总是显示为0.查询表B,始终也没有数据.

    问了一圈,依然没有解决.这就是PL\SQL不乖了,怎么说你也报个错啊,哥.不然都不知道怎么下手……

    于是,先在MySQL数据库上试一试,排除是语法的问题,MySQL上述语法可以成功.

    于是 , 又回到Oracle,仔细查阅了Select into  from 与 insert into select 俩货的相关知识.

    1.insert into select 语句

    语法:insert into 表B (field1,field2,……)select  value1,value2,……from 表A

    注意:a.表B需要先创建,对应的属性field1,field2……也对应存在.

               b.注意语法,不要加values(我师傅卖了个萌,加上了……,加上也没用,哈哈),加values是执行单条插入语句的语法.

    2. select into from 语句

    语法:select value1,value2,…… into 表B from 表A

    注意:表B事先不存在,插入时会自动创建.然后将表A中对应的字段拷贝至表B中


    然而,在MySQL中通通成立的在PL\SQL中傲娇了,看到一篇帖子说报错“ORA-00905:缺失关键字错误”,原因是T-SQL与PL\SQL的区别.

    select..into is part of PL/SQL language which means you have to use it inside a PL/SQL block. You can not use it in a SQL statement outside of PL/SQL.
    即不能单独作为一条sql语句执行,一般在PL/SQL程序块(block)中使用。

    如果想在PL\SQL中实现上述功能,则需要写成:

    create 表B as  select  *  from 表A where rownum <= 500000;

    表B事先不用创建,该句会自动创建.

    更详细的内容尽在:http://blog.sina.com.cn/s/blog_7c7ec19b0100u6vb.html ,用到再扩展.





    
    展开全文
  • 操作oracle数据库时,需要完成一个小的需求,就是将提供给我的csv文件, 其中的字段内容,对应导入到oracle表中。 该csv文件相对于表要缺少两个字段(id,updateTime)。我思路是:测试库中新建一张表,恰巧是...

    我在操作oracle数据库时,需要完成一个小的需求,就是将提供给我的csv文件, 其中的字段内容,对应导入到oracle表中。

    该csv文件相对于表要缺少两个字段(id,updateTime)。我思路是:在测试库中新建一张表,恰巧是csv表中的几个字段,通过Navicat工具的“导入向导”功能,将csv文件内容倒进测试库的表中。

    csv文件:

     

    导入成功后,我可以拿到这张表的“数据结构和数据”,将拿到的sql文件利用Notepad++打开。截取其中的数据sql部分,进行字段填充完善,使其变为能直接插入到现网的insert into 语句。

    插入前,还需要考虑下面的几点。

    1、id自增,或者自动生成都可以

    2、updateTime要是系统当前事件

    围绕上面问题,我的思路是,从sql入手。id自增,可以创建一个触发器,使其让id随着序列的增加而增加(序列提前创好)。updateTime直接可以在插入语句中填充成sysdate就可以。

     

    id自增的步骤:

    1、创建自增序列

    CREATE SEQUENCE RM_LINK_OLTTEST_SEQUENCE
    INCREMENT BY 1 -----{自增量为1}
    START WITH 1 ----------{从1开始自增}
    NOMINVALUE
    NOMAXVALUE
    NOCYCLE

    2、查看自增序列是否创建成功

    select  RM_LINK_OLTTEST_SEQUENCE.NEXTVAL from dual;

     

    3、创建触发器

     

    CREATE OR REPLACE TRIGGER RM_LINK_OLTTEST_SEQ_TRIGGER
       BEFORE INSERT or UPDATE or DELETE ON RM_LINK_OLTTEST 
       FOR EACH ROW
     BEGIN
       SELECT RM_LINK_OLTTEST_SEQUENCE.NEXTVAL INTO :NEW.ID FROM DUAL;
    END TR_FCBOOK;

    4、插入一条样例数据

    insert into RM_LINK_OLTTEST values(RM_LINK_OLTTEST_SEQUENCE.NEXTVAL,'张三','234','324','21','423','tres',sysdate);

     

    测试成功插入该条数据,然后拿到完整sql,插入到正式库中的那张表中。

     

     

    ------------感谢看完,期待交流----------------

    展开全文
  •  我们负责数据仓库的时候,都会有一个中间(ODS层)来存放部分粒度很细的数据,虽然中间不是归档,但是由于每日的业务数据量庞大,每个中间也会存放有几千万条数据,业务时间跨度达到一个月。而且业务...
  • 很多时候,我们会需要对一个进行插入大量的数据,并且希望尽可能短的时间内完成该工作,这里,和大家分享下我平时做大量数据insert的一些经验。前提:做insert数据之前,如果是非生产环境,请将的索引和...
  • MySQL数据表中存在几千条数据,现在需要将数据导出,然后倒入到Oracle数据库中,导出的数据如下: 在Oracle数据库中新建table表shares_list及字段,然后将数据SQL在Oracle中执行。 由于不同数据库对日期字段的...
  • 笔者向一个表中插入数据关联三个表,关联语句中存在子查询,表级容量都千万级,运行时间难以忍受,具体语句如下:INSERT INTO odse.te_prd_aux_prod_ins( SERV_PRODUCT_ROW_ID ,SERV_PRODUCT_ID ,SERV_ROW_...
  • 前段时间做数据库的项目需要ORACL数据库的某些进行拷贝到另一个ORACLE数据库,并给前端提供相应的API接口。 后端采用C/C++框架,应此我选用OCI接口来做,关于OCI的环境安装,参考我上一篇博客 业务分析 ...
  • 一段时间后要开发一个PROC_B,要用PROC_A同样的逻辑,而且这个过程,还要循环调用PROC_A这个过程。摆你面前的有两个选择。 打开PL/SQL,仔细的读PROC_A这个过程,一直到明白了所有的逻辑,然后自己的过程...
  • 通过作者历时3年的写作,本书介绍了Oracle的安装及卸载、数据库的启动关闭、空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份与恢复、模式对象的管理...
  • 背景:数据库oracle,某一张表中存在Date类型字段CREATE_DATE,如何来插入数据和查询数据:方案1:(不修改数据库字段的属性的基础上)1.mybatis的入参实体类中将该字段设计成String.2.mapper.xml中这样写:select ...
  • 通过作者历时3年的写作,本书介绍了Oracle的安装及卸载、数据库的启动关闭、空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份与恢复、模式对象的管理...
  • 通过作者历时3年的写作,本书介绍了Oracle的安装及卸载、数据库的启动关闭、空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份与恢复、模式对象的管理...
  • Karen Morton及其团队本书提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并工作加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家...
  • 她是Oracle ACE,也是OakTable(Oracle社区著名的“Oracle科学家”的非正式组织)的成员,经常技术会议上演讲。她的著作还包括 Expert Oracle Practices和Beginning Oracle SQL,博客主页是karenmorton....
  • 内容主要集中大多数企业常见的问题之上,如安装和升级到oracle database 11g数据库软件、创建数据库、导出和导入数据、数据库的备份与恢复、性能调优,等等。  本书还提供了dba完成本职工作必备的基本的uniix...
  • 通过作者历时3年的写作,本书介绍了Oracle的安装及卸载、数据库的启动关闭、空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份与恢复、模式对象的管理...
  • oracle chm帮助文件下载

    2020-12-16 13:32:33
    [Q]怎么样查询特殊字符,如通配符%与_ [Q]如何插入单引号到数据库表中 [Q]怎样设置事务一致性 [Q]怎么样利用光标更新数据 [Q]怎样自定义异常 [Q]十进制与十六进制的转换 [Q]能不能介绍SYS_CONTEXT的详细用法 [Q...
  • 5.3 用SQL 从表中选择数据 64 5.4 select 、from 、where和order by 67 5.5 逻辑和值 69 5.5.1 单值测试 70 5.5.2 值列表的简单测试 75 5.5.3 组合逻辑 77 5.6 where 的另一个用途:子查询 78 5.6.1 从子...
  • ORACLE重建索引总结

    2011-12-13 10:32:28
    4、索引高度:索引高度是指由于数据行的插入操作而产生的索引层数,当表中添加大量数据时,oracle将生成索引的新层次以适应加入的数据行,因此,oracle索引可能有4层,但是这只会出现索引数中产生大量插入操作的...
  • 读者阅读本书的过程如果遇到问题或者有意见建议,请发送邮件到这个Google群组:troubleshooting-oracle-performance@googlegroups.com。另外请关注http://dbanotes.net/top,我们将这里第一时间发布勘误信息。...
  • [Oracle.11g权威指南(第2版)].谷长勇.扫描版.pdf

    千次下载 热门讨论 2013-06-23 21:16:09
    本章介绍了分区和索引分区及其数据库性能优化方面的作用,并通过实例介绍了Oracle 11g对索引技术最新的增强功能。 14.1 分区技术概述 324 14.2 分区的方法说明及实例 325 14.2.1 范围分区(Range) 325 14.2.2...
  • 日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,具体...
  • 在Oracle公司,Kyte专门负责Oracle数据库,他的任务是帮助使用Oracle数据库的客户,并与他们共同设计和构建系统,或者对系统进行重构和调优。在进入Oracle公司之前,Kyte是一名系统集成人员,主要为美国军方和政府...
  • 例:将test表中的Count列宽度加长为10个字符 sql>alter atble test modify (County char(10)); b、将一张表删除语句的格式如下: DORP TABLE 表名; 例:表删除将同时删除表的数据和表的定义 sql>drop table ...
  • §1.1.1 Oracle数据字典 23 §1.1.2 空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1 数据文件 26 §1.2.2 控制文件 26 §1.2.3 重做日志文件 26 §1.2.4 其它支持文件 26 §...

空空如也

空空如也

1 2 3 4
收藏数 69
精华内容 27
关键字:

如何在oracle表中插时间数据