NULL 日期字段默认使用 SYSDATE 填充

NULL Date field is populated with SYSDATE by default

我正在运行查询我公司的时钟数据。我有一个包含 2 个字段的查询:CLOCK_IN1CLOCK_OUT1。当我 运行 查询时,我看到了正确的 CLOCK_IN1,但是 CLOCK_OUT1 被填充了接近 SYSDATE 的日期。 CLOCK_OUT1 在数据库中是 NULL,它正在用这个日期替换 NULL

是否有设置在 NULL 时填充日期?

两者都有

  • 应用于该列的 DEFAULT 值,或
  • 执行此操作的数据库触发器。

这是第一个的工作原理:

SQL> create table test
  2    (clock_in1    date,
  3     clock_out1   date   default sysdate
  4    );

Table created.

SQL> insert into test (clock_in1) values (date '2020-08-23');

1 row created.

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select sysdate from dual;

SYSDATE
-------------------
03.11.2020 20:23:03

SQL> select * from test;

CLOCK_IN1           CLOCK_OUT1
------------------- -------------------
23.08.2020 00:00:00 03.11.2020 20:22:48

SQL>

这是第二个:

SQL> drop table test;

Table dropped.

SQL> create table test
  2    (clock_in1    date,
  3     clock_out1   date
  4    );

Table created.

SQL> create or replace trigger trg_bi_test
  2    before insert on test
  3    for each row
  4  begin
  5    :new.clock_out1 := nvl(:new.clock_out1, sysdate);
  6  end;
  7  /

Trigger created.

SQL> insert into test (clock_in1) values (date '2020-08-23');

1 row created.

SQL> select * from test;

CLOCK_IN1           CLOCK_OUT1
------------------- -------------------
23.08.2020 00:00:00 03.11.2020 20:24:23

SQL>

如何“修复”它?

SQL> alter table test modify clock_out1 default null;

Table altered.

SQL>

从触发器开始,好吧......这取决于它在做什么,但是 - 删除设置列值的行就可以了。