如何在列中添加“現在”日期?我想實作以下場景:如果我今天插入一行,則日期列的值為 25/10/2021,如果明天我將執行 SELECT 陳述句,我希望看到該列更新為值 26/10 /2021 等等。有沒有辦法讓列保持更新而無需我手動執行任何操作?謝謝。
稍后編輯:我想將該列用于時態表中的 PERIOD。示例:PERIOD FOR example_period(some_date, now_date)
uj5u.com熱心網友回復:
我很高興我們都同意這毫無意義。但如果這讓你的老板高興...
創建視圖
create myview as
select some_date, trunc(sysdate) as now_date
from mytable;
或者創建一個計算列
alter mytable add column now_date as trunc(sysdate);
uj5u.com熱心網友回復:
那沒有任何意義。就好像你剛剛
select empno, ename,
sysdate --> this
from employees
每次。
SELECT不會更新任何列值,所以......如果你想讓它與 保持同步,你為什么要首先存盤這樣的日期sysdate?
但是,如果您希望 Oraclesysdate作為其默認值插入到該列中,那么您可以這樣創建列,例如
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它的價值。
uj5u.com熱心網友回復:
添加一個用 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”。
uj5u.com熱心網友回復:
您可以使用生成的列:
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;
輸出是:
ID EMP_ID 薪水 開始日期 結束日期 ASSUMED_END_DATE 1 1 123 2021-01-01 00:00:00 2021-10-25 13:28:08
那么如果你這樣做:
UPDATE salaries
SET END_DATE = DATE '2021-10-01'
WHERE id = 1;
INSERT INTO salaries (emp_id, salary, start_date)
VALUES (1, 234, DATE '2021-10-01');
然后:
SELECT *
FROM salaries;
輸出是:
ID EMP_ID 薪水 開始日期 結束日期 ASSUMED_END_DATE 1 1 123 2021-01-01 00:00:00 2021-10-01 00:00:00 2021-10-01 00:00:00 2 1 234 2021-10-01 00:00:00 2021-10-25 13:28:08
db<>在這里小提琴
uj5u.com熱心網友回復:
在您的請求評論中,您從根本上改變了您的請求。
一個問題:您有一個開放的日期范圍,有一個開始日期和一個結束日期。但是當顯示這個時,你想用當前日期替換 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, DATE '2010-12-24', NULL);
UPDATE salaries SET end_date = TRUNC(SYSDATE) - 1
WHERE empno = 50 AND end_date IS NULL;
如果您希望此更新自動發生,主要有兩種選擇:
- 為新薪水撰寫一個程序,執行插入和更新
- 寫一個觸發器來執行更新
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336010.html
上一篇:有一個時間列的最近時期
