在 Oracle 中基于 ddmmyyy 格式的日期更新触发器列
Update trigger column based on date in ddmmyyy format in Oracle
我创建了一个触发器,我想根据它为列分配一些值。
例如:我有一个列名称 BILL_CALCULATED_DATE
,其值为 19-10-21
,格式为 dd-mm-yy
。我想提取 mm 如果它是 10
那么我想将它分配为 October
下面是我的触发器
CREATE OR REPLACE TRIGGER TRG_UPD_GTL_BILL
BEFORE INSERT OR UPDATE ON IPFEE_MST_INSRT_GTL
FOR EACH ROW
BEGIN
:new.BILL_CALCULATED_DATE := case :NEW.UPLOADED_MONTH
when '01' then 'January'
when '02' then 'February'
when '03' then 'March'
when '04' then 'April'
when '05' then 'May'
when '06' then 'June'
when '07' then 'July'
when '08' then 'August'
when '09' then 'September'
when '10' then 'October'
when '11' then 'November'
when '12' then 'December'
end;
end;
但问题是,在触发器中分配月份之前,我想提取月份。我应该如何实现它?
是这样的吗?
SELECT EXTRACT(month FROM SYSDATE) from dual
据我了解,您的专栏不是日期格式。首先将其转换为日期,然后使用 EXTRACT 函数 -
SELECT EXTRACT(month FROM TO_DATE(BILL_CALCULATED_DATE, 'dd-mm-yy'))
FROM IPFEE_MST_INSRT_GTL;
假设您的 BILL_CALCULATED_DATE
列是 DATE
数据类型并且您希望 UPLOADED_MONTH
列是对应于 BILL_CALCULATED_DATE
的月份的名称然后月份:
不要使用触发器;使用虚拟列,那么列值将始终同步。
要么创建 table 使用:
CREATE TABLE IPFEE_MST_INSRT_GTL(
BILL_CALCULATED_DATE DATE,
UPLOADED_MONTH VARCHAR2(9)
GENERATED ALWAYS AS (
CAST(
TO_CHAR(BILL_CALCULATED_DATE, 'fmMonth', 'NLS_DATE_LANGUAGE=English')
AS VARCHAR2(9)
)
)
);
或修改现有的table以删除non-virtual列并添加一个虚拟列:
ALTER TABLE IPFEE_MST_INSRT_GTL DROP COLUMN UPLOADED_MONTH;
ALTER TABLE IPFEE_MST_INSRT_GTL
ADD UPLOADED_MONTH VARCHAR2(9)
GENERATED ALWAYS AS (
CAST(
TO_CHAR(BILL_CALCULATED_DATE, 'fmMonth', 'NLS_DATE_LANGUAGE=English')
AS VARCHAR2(9)
)
);
如果必须使用触发器和真实列,则:
CREATE OR REPLACE TRIGGER TRG_UPD_GTL_BILL
BEFORE INSERT OR UPDATE ON IPFEE_MST_INSRT_GTL
FOR EACH ROW
BEGIN
:NEW.UPLOADED_MONTH := TO_CHAR(
:new.BILL_CALCULATED_DATE,
'fmMonth',
'NLS_DATE_LANGUAGE=English'
);
END;
/
如果您的 BILL_CALCULATED_DATE
列是 CHAR
或 VARCHAR2
数据类型,则:
- 将该列更改为
DATE
。
- 如果您无法将其更改为
DATE
,请与可以将其更改为 DATE
的人交谈。
- 如果你真的,真的不能把它改成
DATE
然后花时间对无法遵循最佳实践感到绝望,试着说服那些可能有能力做某事的人你应该改变东西,然后在上面的代码片段中将 BILL_CALCULATED_DATE
替换为 TO_DATE(BILL_CALCULATED_DATE, 'DD-MM-YY')
或将 :new.BILL_CALCULATED_DATE
替换为 TO_DATE(:new.BILL_CALCULATED_DATE, 'DD-MM-YY')
。
db<>fiddle here
我创建了一个触发器,我想根据它为列分配一些值。
例如:我有一个列名称 BILL_CALCULATED_DATE
,其值为 19-10-21
,格式为 dd-mm-yy
。我想提取 mm 如果它是 10
那么我想将它分配为 October
下面是我的触发器
CREATE OR REPLACE TRIGGER TRG_UPD_GTL_BILL
BEFORE INSERT OR UPDATE ON IPFEE_MST_INSRT_GTL
FOR EACH ROW
BEGIN
:new.BILL_CALCULATED_DATE := case :NEW.UPLOADED_MONTH
when '01' then 'January'
when '02' then 'February'
when '03' then 'March'
when '04' then 'April'
when '05' then 'May'
when '06' then 'June'
when '07' then 'July'
when '08' then 'August'
when '09' then 'September'
when '10' then 'October'
when '11' then 'November'
when '12' then 'December'
end;
end;
但问题是,在触发器中分配月份之前,我想提取月份。我应该如何实现它?
是这样的吗?
SELECT EXTRACT(month FROM SYSDATE) from dual
据我了解,您的专栏不是日期格式。首先将其转换为日期,然后使用 EXTRACT 函数 -
SELECT EXTRACT(month FROM TO_DATE(BILL_CALCULATED_DATE, 'dd-mm-yy'))
FROM IPFEE_MST_INSRT_GTL;
假设您的 BILL_CALCULATED_DATE
列是 DATE
数据类型并且您希望 UPLOADED_MONTH
列是对应于 BILL_CALCULATED_DATE
的月份的名称然后月份:
不要使用触发器;使用虚拟列,那么列值将始终同步。
要么创建 table 使用:
CREATE TABLE IPFEE_MST_INSRT_GTL(
BILL_CALCULATED_DATE DATE,
UPLOADED_MONTH VARCHAR2(9)
GENERATED ALWAYS AS (
CAST(
TO_CHAR(BILL_CALCULATED_DATE, 'fmMonth', 'NLS_DATE_LANGUAGE=English')
AS VARCHAR2(9)
)
)
);
或修改现有的table以删除non-virtual列并添加一个虚拟列:
ALTER TABLE IPFEE_MST_INSRT_GTL DROP COLUMN UPLOADED_MONTH;
ALTER TABLE IPFEE_MST_INSRT_GTL
ADD UPLOADED_MONTH VARCHAR2(9)
GENERATED ALWAYS AS (
CAST(
TO_CHAR(BILL_CALCULATED_DATE, 'fmMonth', 'NLS_DATE_LANGUAGE=English')
AS VARCHAR2(9)
)
);
如果必须使用触发器和真实列,则:
CREATE OR REPLACE TRIGGER TRG_UPD_GTL_BILL
BEFORE INSERT OR UPDATE ON IPFEE_MST_INSRT_GTL
FOR EACH ROW
BEGIN
:NEW.UPLOADED_MONTH := TO_CHAR(
:new.BILL_CALCULATED_DATE,
'fmMonth',
'NLS_DATE_LANGUAGE=English'
);
END;
/
如果您的 BILL_CALCULATED_DATE
列是 CHAR
或 VARCHAR2
数据类型,则:
- 将该列更改为
DATE
。 - 如果您无法将其更改为
DATE
,请与可以将其更改为DATE
的人交谈。 - 如果你真的,真的不能把它改成
DATE
然后花时间对无法遵循最佳实践感到绝望,试着说服那些可能有能力做某事的人你应该改变东西,然后在上面的代码片段中将BILL_CALCULATED_DATE
替换为TO_DATE(BILL_CALCULATED_DATE, 'DD-MM-YY')
或将:new.BILL_CALCULATED_DATE
替换为TO_DATE(:new.BILL_CALCULATED_DATE, 'DD-MM-YY')
。
db<>fiddle here