繁体   English   中英

如何将具有季度日期的 varchar 转换为日期格式?

[英]How convert varchar with quarter date to date format?

我有 varchar2 (7 BYTE) PERIOD列,其中年份和季度数的格式如下:

2017-03

我需要将其转换为日期格式,但我试试这个:

SELECT TO_CHAR(PERIOD, 'YYYY-MM') FROM SCHEM_NAME.TABLE_NAME

我得到错误:

ORA-01722: 无效号码 01722. 00000 - “无效号码” *原因:指定的号码无效。 *行动:指定一个有效的数字。

我知道指定的数字无效,但我不明白我需要尝试的格式。

同样在我将尝试从今天的日期起超过五年的那个季度从表中删除所有数据之后。

你能解释一下什么是最合适或最好的方法吗?

我想使用 DROP PARTITION 类似的东西:

ALTER TABLE SCHEM_NAME.TABLE_NAME DROP PARTITION 

更新:

使用这个:

SELECT TO_DATE(MAX(PERIOD), 'YYYY-MM') - interval '5' year
FROM SCHEM_NAME.TABLE_NAME

我得到了我需要放弃的日期。 例如:

01-MAR-17

我需要删除早于该日期的所有内容。 最合适的方法是什么?

您想将VARCHAR转换为DATE数据类型,那么为什么要使用to_char() function 进行转换?! to_char()DATE的日期时间或间隔值转换为VARCHAR2数据类型的值。 您应该使用to_date() function。 to_dateCHARVARCHAR2NCHARNVARCHAR2数据类型的 char 转换为DATE数据类型的值:

select to_date(period, 'YYYY-MM') from t1;

在这里试试: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=12753f2f59fb5ce4812fa0af319c1deb

Select:

如所问,您的PERIOD列在 varchar2 中包含一年的季度。

SELECT * FROM SCHEM_NAME.TABLE_NAME 
WHERE LAST_DAY(ADD_MONTHS(TO_DATE(SUBSTR(PERIOD, 1, Instr(PERIOD, '-', -1, 1) -1) 
  || '-' || 
  LPAD(TO_NUMBER(SUBSTR(PERIOD, Instr(PERIOD, '-', -1, 1) +1))*3, 2, 0), 'YYYY-MM'), (5*12))) > SYSDATE;

删除:

DELETE SCHEM_NAME.TABLE_NAME 
WHERE LAST_DAY(ADD_MONTHS(TO_DATE(SUBSTR(PERIOD, 1, Instr(PERIOD, '-', -1, 1) -1) 
  || '-' || 
  LPAD(TO_NUMBER(SUBSTR(PERIOD, Instr(PERIOD, '-', -1, 1) +1))*3, 2, 0), 'YYYY-MM'), (5*12))) > SYSDATE;

解释:

  • 使用 Substr,Instr 将从 varchar2 PERIOD 中提取年份和季度。
  • LAST_DAY 使用相乘的季度月份的最后一天。
  • ADD_MONTHS 为与当前日期 (SYSDATE) 相关的条件添加 5 年到PERIOD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM