如何在ORACLE SQL列中添加当前日期?



如何添加"now"列中的日期?我想实现以下场景:如果我今天插入一行,日期列将具有25/10/2021的值,如果明天我将执行SELECT语句,我希望看到该列更新为26/10/2021的值,等等。有没有一种方法来保持列更新,而不需要我手动做任何事情?谢谢。

稍后编辑:我想在时态表中使用该列作为PERIOD。示例:PERIOD FOR example_period(some_date, now_date)

在你的请求注释中,你已经从根本上改变了你的请求。

有一个问题:您有一个开放的日期范围,包括开始日期和结束日期。但是当显示这个时,你需要替换no end"使用当前日期。这通常是通过为日期存储null(无值)来实现的。在查询中,可以使用COALESCE将其替换为当前日期:

SELECT
empno,
salary,
start_date AS first_day,
COALESCE(end_date, TRUNC(SYSDATE)) AS last_day
FROM salaries;

为了方便,你可以把它变成一个视图:

CREATE VIEW v_salaries AS SELECT <above query>

另一个问题是,您希望在添加新的工资信息时更改此null。

手动输入

INSERT INTO salaries (empno, salary, start_date, end_date)
VALUES(50, 1200, TRUNC(SYDATE), NULL);
UPDATE salaries SET end_date = TRUNC(SYSDATE) - 1
WHERE empno = 50 AND end_date IS NULL;

如果你想让这个更新自动发生,主要有两个选项:

  1. 为新工资编写一个过程,执行插入和更新
  2. 写一个触发器执行更新

这没有任何意义。就好像你只需要

select empno, ename,
sysdate                     --> this
from employees

每次。

SELECT不会更新任何列值,所以…如果你想让它与sysdate保持同步,为什么要首先存储这样一个日期呢?


但是,如果您希望Oracle将sysdate插入该列作为其默认值,那么您将创建这样的列,例如

SQL> create table test
2    (id      number,
3     datum   date default sysdate
4    );
Table created.
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.
SQL> insert into test (id) values (1);
1 row created.
SQL> select * from test;
ID DATUM
---------- -------------------
1 25.10.2021 14:05:02
SQL>

但是,它将永远保持不变,除非你真的把它的值update

添加一个用sysdate填充列的触发器:

create or replace TRIGGER TRG_FILL_DATE
BEFORE INSERT ON MY_TABLE
FOR EACH ROW
WHEN (NEW.MY_DATE_COLUMN IS NULL)
BEGIN
SELECT sysdate INTO :NEW.MY_DATE_COLUMN FROM DUAL;
END;

或者按照建议在列上使用'DEFAULT sysdate'。

您可以使用生成的列:

CREATE TABLE salaries (
id               NUMBER(10,0)
GENERATED ALWAYS AS IDENTITY
CONSTRAINT salaries__id__pk PRIMARY KEY,
emp_id           CONSTRAINT salaries__emp_id__fk REFERENCES employees (id)
NOT NULL,
salary           NUMBER(12,2)
NOT NULL,
start_date       DATE
NOT NULL,
end_date         DATE
NULL,
assumed_end_date DATE
GENERATED ALWAYS AS (date_or_now(end_date))
NOT NULL
);

并创建DETERMINISTIC函数(稍微滥用了它的使用方式):

CREATE FUNCTION date_or_now (dt IN DATE) RETURN DATE DETERMINISTIC
IS
BEGIN
RETURN COALESCE(dt, SYSDATE);
END;
/

如果你:

INSERT INTO salaries (emp_id, salary, start_date)
VALUES (1, 123, DATE '2021-01-01');

:

SELECT *
FROM   salaries;

输出为:

<表类>IDEMP_ID工资START_DATEEND_DATEASSUMED_END_DATEtbody><<tr>111232021-01-01就是2021-10-25 13:28:08

最新更新