我有一个简单的PL SQL代码。但是它在日期级别失败了。日期列是CODT。我宣布CODT为日期。在数据库级别,它是格式为YYYY-MM-DD的日期。
我也尝试过更改会话集nls_date_format ='YYYY-MM-DD';但这是错误。
错误消息为ORA-01830:日期格式图片在转换整个输入字符串之前结束
你可以让我知道我需要把它更改为日期格式/我犯错的地方吗?
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;
答案 0 :(得分:0)
如果你在db中有定义varchar2 的日期列,你应该像这样使用它:to_date(your_column/*CUT_OFF_DT*/, 'yyyy-mm-dd')
答案 1 :(得分:0)
当您使用 VARCHAR2 字段并将其插入带有 DATE 数据类型的表格中时,您告诉oracle:将 VARCHAR2 转换为的 DATE 强>
所以你的错误是在没有提供任何格式的情况下进行投射,这里是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 类型来计算2个日期之间的间隔(特别是时间戳),并且有一个名为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 ,goodluck
的用法有用