【问题标题】:Working with dates in PL SQL在 PL SQL 中处理日期
【发布时间】:2017-04-30 11:17:53
【问题描述】:

我有一个简单的 PL SQL 代码。但是,它在日期级别上失败了。日期列是 CODT。我宣布 CODT 为日期。在数据库级别,它是格式为 YYYY-MM-DD 的日期。

我也尝试了 alter session set nls_date_format = 'YYYY-MM-DD';但它正在抛出错误。

错误信息是ORA-01830:日期格式图片在转换整个输入字符串之前结束

  1. 00000 - “日期格式图片在转换整个输入字符串之前结束”

您能告诉我我需要在哪里将其更改为日期格式/我在哪里犯了错误吗?

    DECLARE

    RID      VARCHAR2(100);
    KY       VARCHAR2(200);
    CODT     DATE;

    CURSOR FETCH_DTLS IS

    SELECT ROW_ID, 
           KEY, 
           CUT_OFF_DT,
    FROM TMP1
    WHERE RN = 1;

    BEGIN

    OPEN FETCH_DTLS;

    LOOP

    FETCH FETCH_DTLS 
    INTO RID,
         KY,
         CODT;

    EXIT WHEN FETCH_DTLS%NOTFOUND;

    INSERT INTO tmp2
    VALUES
    (RID,
     KY,
     CODT
    );

    END LOOP;

    COMMIT;

    CLOSE FETCH_DTLS;

    COMMIT;

    END;

【问题讨论】:

  • tmp1CUTT_OFF_DT的数据类型是什么?不要假设也不要猜测;运行describe tmp1 看看它告诉你什么。提示:您在数据库级别提到它是“格式 ”。 DATE 数据类型中的列没有格式。很可能在数据库级别您有某种字符串(可能是 VARCHAR2),而不是日期。如果是这样,您必须先将其转换为日期。
  • 是的,在 TMP1 表中,它是 VARCHAR2(50 CHAR)。但在 TMP2 表中,它是 DATE。
  • 完美。然后将SELECT 中的CUT_OFF_DT 替换为to_date(CUT_OFF_DT, 'yyyy-mm-dd')。那应该可以解决它。

标签: sql oracle plsql


【解决方案1】:

如果您在 db 中有 定义 varchar2 的日期列,您应该像这样使用它:to_date(your_column/*CUT_OFF_DT*/, 'yyyy-mm-dd')

【讨论】:

    【解决方案2】:

    当您使用 VARCHAR2 字段并将其插入具有 DATE 数据类型的表中时,您告诉 oracle:将 VARCHAR2 转换为日期

    所以你的错误是在没有提供任何格式的情况下进行转换,以下是 oracle 中使用的一些日期格式示例:

    'YYYY-MM-DD'
    'YYYY-MM-DD HH24:MI:SS'
    

    oracle 中还有另一个名为 TO_DATE 的函数可以完成这项工作,它只是将字符串(char 或 varchar)转换为具有提供的日期格式和提供的日历的日期!下面是一些例子:

    TO_DATE('2016-12-15','YYYY-MM-DD')--uses default calendar of session
    TO_DATE('2016-12-15','YYYY-MM-DD', 'nls_calendar=gregorian')
    TO_DATE('1395-09-25','YYYY-MM-DD', 'nls_calendar=persian')--Solar base date used in IRAN
    

    反向函数是TO_CHAR

    TO_CHAR(SYSDATE,'YYYY-MM-DD')--SYSDATE is in Date type so this works
    

    还有另一种与日期相关的数据类型,称为TIMESTAMP

    TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SSxFF')--SYSTIMESTAMP is in TIMESTAMP type so this works
    

    最后我们可以使用 INTERVAL 类型来计算两个日期之间的间隔(特别是时间戳),并且有一个有用的函数叫做 numtodsinterval 可以将数字转换为间隔,你可以像这样使用它:

    SYSDATE+NUMTODSINTERVAL(1,'Minute')
    

    这是一个例子:

    SELECT  TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'), 
            TO_CHAR(SYSDATE+NUMTODSINTERVAL(1,'Minute'),'YYYY-MM-DD HH24:MI:SS')
      FROM  DUAL
    

    哪个输出:

    1   2016-12-15 15:05:10 2016-12-15 15:06:10
    

    我希望它对你以后使用 DATE 有帮助,祝你好运

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      相关资源
      最近更新 更多