从日期中提取月份数并更新同一个表-Oracle

时间:2016-09-28 07:21:04

标签: sql oracle date

我的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);

我的问题是,如果没有创建新表并更新原始表中的月份数列,是否有更好的方法?

2 个答案:

答案 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') ;