我的table hire_table包含2列id,hire_date。 hire_date的格式为dd-mm-yyyy格式。有没有办法从日期中提取月份数并同时更新hire_table?
我知道如下所示的解决方案。
1) create a separate table to extract id and month number.
create table monthtable as(
select id , EXTRACT(month FROM hire_date) as monthno
from hire_table);
2)using left join combine the 2 tables.
create table new_hiretable as(
select hiretable.* , monthtable.monthno
from hiretable left join monthtable
on hiretable.id=monthtable.id);
我的问题是,如果没有创建新表并更新原始表中的月份数列,是否有更好的方法?
答案 0 :(得分:3)
存储冗余数据通常不是一个好主意 - 可以在运行时从完整日期中提取月份数,因此如果一列已更新,则单独存储它只会使您重复并可能出错。另一个不是;你必须设置额外的列值,例如通过触发器。
我也不确定你是否真的想要月份编号(没有参考年份)或者真的想要没有特定日期的雇佣月份,所以我会生成两者。
您可以从以下查询中获取值:
select id, hire_date,
extract(month from hire_date) as month_no,
trunc(hire_date, 'MM') as hire_month
from hire_table;
如果要隐藏,则可以根据该查询创建视图:
create view hire_view as
select id, hire_date,
extract(month from hire_date) as month_no,
trunc(hire_date, 'MM') as hire_month
from hire_table;
并查询:
select * from hire_view;
假设你的人数在11克或更高,你也可以修改你的表格来代替virtual column:
alter table hire_table add (
month_no number generated always as (extract(month from hire_date)) virtual,
hire_month date generated always as (trunc(hire_date, 'MM')) virtual
);
查询表格时,您将看到生成的值,无需额外维护:
insert into hire_table (id, hire_date) values (1, date '2015-07-04');
select * from hire_table;
ID HIRE_DATE MONTH_NO HIRE_MONTH
---------- ---------- ---------- ----------
1 2015-07-04 7 2015-07-01
答案 1 :(得分:0)
您的第二个ctas查询类似于以下查询:
SELECT hiretable.*,
EXTRACT(MONTH FROM hire_date) AS monthno
FROM hiretable;
是否真的有必要创建一个新表来更新表中的hire_date。 如果没有,您可以使用以下查询来更新列 但是,如果您的列是date数据类型,则需要将month转换为DATE,因为此处EXTRACT函数将返回一个不能用于更新日期列的数字。
UPDATE hire_table
SET hire_date = to_date(EXTRACT(MONTH FROM hire_date),'mm') ;