【发布时间】:2021-09-17 00:13:13
【问题描述】:
我有许多名称中带有日期的表。例如MY_TABLE_2021_06_01, MY_TABLE_2021_06_02, etc。我正在尝试从表名中提取日期,并查看是否有任何表超过一年。这是我的代码:
select * from (
select
table_name,
to_date(substr(table_name,-2,2)||'/'||substr(table_name,-5,2)||'/'||substr(table_name,-10,4),'DD/MM/YYYY') TABLE_DATE
from
all_tables
where
owner = 'my_schema'
and table_name like '%_20%'
)
where
TABLE_DATE < trunc(sysdate)-365;
如果我不包含 where 子句 where table_date < trunc(sysdate)-365,上面的代码可以正常工作。如果我使用 where 子句运行代码,那么我会得到
ORA-01858:在需要数字的地方发现了一个非数字字符 01858. 00000 - “在需要数字的地方发现了一个非数字字符” *原因:要使用日期格式模型转换的输入数据是 不正确。输入数据不包含数字 格式模型所要求的。 *行动:修复输入数据或日期格式模型,以确保 元素在数量和类型上匹配。然后重试操作。
我尝试了另一种冗长的方法来查看是否可以让我的代码正常工作,但它仍然会引发相同的错误。我的新代码:
select * from (
select table_name, case when table_date < old_date then 1 else 0 end as OLD_TABLE from (
select
table_name,
to_date(substr(table_name,-2,2)||'/'||substr(table_name,-5,2)||'/'||substr(table_name,-10,4),'DD/MM/YYYY') TABLE_DATE,
trunc(sysdate)-365 OLD_DATE
from
all_tables
where
owner = 'my_schema'
and table_name like '%_20%'
)
)
where
old_table = 1
order by
old_table desc;
如果我不包含where old_table = 1 子句,上面的代码同样可以正常工作,但在包含 where 子句时会给出相同的 ORA-01858 错误。我不明白这一点,因为字段 OLD_TABLE 不是日期字段,但仍然出现日期格式错误。
【问题讨论】:
-
"I have many tables with a date in their name"- 为什么?这听起来是个坏主意。数据(包括日期)属于表的数据集,而不是其名称。如果这是关于快速访问和删除完整天数,您可以考虑分区表,但不要按日期创建表。 -
@ThorstenKettner,不幸的是不在我手中。这就是源系统生成这些表的方式,我只需要照原样摄取它们。
标签: sql oracle oracle-sqldeveloper