【问题标题】:Skip Characters in Oracle TO_DATE functionOracle TO_DATE 函数中的跳过字符
【发布时间】:2015-03-24 10:02:19
【问题描述】:

我正在使用 SQL Developer 的导入数据向导将 .tsv (yyyy-mm-dd hh24:mi:ss.mmm) 中具有 SQL Server 格式日期的数据导入 Oracle 数据库。

如何忽略 .mmm 字符以将它们导入 DATE 列?我似乎无法找到答案;我知道 DATE 列不包含毫秒,但为什么我不能忽略 TO_DATE 调用中的特定模式?

另请注意,由于我没有生成 TO_DATE 调用,因此我无法在导入期间SUBSTRING 或以其他方式操纵 .tsv 的值。

【问题讨论】:

    标签: sql date oracle11g to-date


    【解决方案1】:

    您可以为此使用井号 (#):

    SELECT TO_DATE('2015-01-01 01:00:00.999', 'yyyy-mm-dd hh24:mi:ss.###') FROM dual;
    --> 01/01/2015 01:00:00
    

    我在documentation 中没有找到这个,所以我不能说为什么,但这些也有效:

    SELECT TO_DATE('01_','hh24#') FROM dual;
    
    SELECT TO_DATE('01:01:01.0xx','hh24:mi:ss.###') FROM dual;
    

    这些似乎不起作用:

    SELECT TO_DATE('010','hh24#') FROM dual;
    
    SELECT TO_DATE('01:01:01.xxx','hh24:mi:ss.###') FROM dual;
    

    这似乎没有记录,但您似乎可以毫无问题地互换标点符号:

    SELECT TO_DATE('2015-01;01 11:12/13',
                   'yyyy.mm,dd_hh-mi ss') FROM dual;
    --> 01/01/2015 11:12:13
    

    如果您知道要忽略哪些文本,则可以使用 用双引号括起来的字符文字

    SELECT TO_DATE('foo2015bar-01-!#%}01', '"foo"yyyy"bar"-mm-"!#%}"dd') FROM dual;
    --> 01/01/2015
    

    【讨论】:

    • 这正是我正在寻找的。它是否代表任何字符,包括.:?类似TO_DATE('junk2015.a03.b27c13:55d.33.888efg', '####yyyy.#mm.#dd#hh24.mi#.ss#######')
    • 我没有在文档中找到它,但它似乎不像这样工作。 ('01_','hh24#') 有效,而 ('010','hh24#') 无效。 ('01:01:01.0xx','hh24:mi.ss.###') 有效,但 ('01:01:01.xxx','hh24:mi.ss.###') 无效。
    • 所以它必须以数字开头?唔。注意 mi 和 ss 之间格式字符串中的 .: 工作。
    • 这行得通,但我仍然对TO_DATE 如何与这些字符一起使用感到困惑:#:.(它也与SELECT TO_DATE('2015-01-01 01:00:00.999', 'yyyy.mm.dd hh24.mi:ss....') FROM dual; 一起使用。您能否添加一些有关此操作的详细信息有效吗?
    • 我试图将我的发现编辑到我的答案中,但我在文档中找不到它。随意提出另一个问题,链接到这个问题 - 也许其他人知道这是如何工作的详细信息。
    【解决方案2】:

    没有必要这样做;如果您尝试将小数秒添加到日期列,Oracle 会自动将时间戳转换为日期。请改用TO_TIMESTAMP() 并使用小数秒。

    SQL> create table tmp_test (dt date);
    
    Table created.
    
    SQL> insert into tmp_test
      2  select to_timestamp('2015-03-24 13:10:03.654','yyyy-mm-dd hh24:mi:ss.FF3')
      3    from dual;
    
    1 row created.
    
    SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
    
    Session altered.
    
    SQL> alter session set nls_timestamp_format = 'yyyy-mm-dd hh24:mi:ss.FF3';
    
    Session altered.
    
    SQL> select * from tmp_test;
    
    DT
    -------------------
    2015-03-24 13:10:03
    
    SQL>
    

    【讨论】:

    • 我很感激有解决方法;但在这种情况下,我使用的是 SQL Developer 中的导入数据向导,目标列是 DATE,我只需要修改 TO_DATE() 的格式字符串,而不是 TO_TIMESTAMP()。我正在寻找的是任何将忽略该位置的字符的符号:例如yyyy-mm-dd hh24:mi:ss**** 或将有效地忽略带有TO_DATE() 的毫秒的符号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2011-10-28
    • 2014-02-01
    • 2020-11-24
    • 2017-04-12
    相关资源
    最近更新 更多