繁体   English   中英

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

[英]Extract month number from a date and update the same table -Oracle

我有包含 2 列 id 和hiring_date 的表hiring_table。 雇佣日期的格式为 dd-mm-yyyy 格式。 有没有办法从日期中提取月份数并同时更新租用表?

我知道如下所示的解决方案。

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

我的问题是,有没有更好的方法而不创建新表和更新原始表中的月份数列?

存储冗余数据通常不是一个好主意 - 可以在运行时从完整日期中提取月份数,因此单独存储它只会给您带来重复和错误的可能性,如果一列已更新而另一列已更新不是; 并且您必须设置额外的列值,例如通过触发器。

我也不确定您是否真的想要月份编号(不参考年份)或者真的想要没有特定日期的雇佣月份,所以我会同时生成两者。

您可以从如下查询中获取值:

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;

假设您使用 11g 或更高版本,您还可以修改您的表以使用虚拟列

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

您的第二个 ctas 查询类似于以下查询:

SELECT hiretable.*, 
       EXTRACT(MONTH FROM hire_date) AS monthno
FROM   hiretable;

是否真的有必要创建一个新表来更新表中的hiring_date。 如果不是,您可以使用以下查询来更新列。
但是,如果您的列是日期数据类型,您需要将月份转换为 DATE,因为这里的 EXTRACT 函数将返回一个不能用于用日期更新列的数字。

UPDATE hire_table 
SET    hire_date = to_date(EXTRACT(MONTH FROM hire_date),'mm') ;

暂无
暂无

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

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