时态表时间范围在更改一段时间的值后满足

问题描述 投票:0回答:1

我在 MariaDB 中有一个时态表,其中包含应用程序时间。

create or replace table Contracts (
Event_ID Integer NOT NULL AUTO_INCREMENT PRIMARY KEY,
Employee_ID integer NOT NULL,
Working_hours integer,
Contract_Begin Date,
Contract_End Date,
Period for valid_time(Contract_Begin, Contract_End),
unique (Employee_ID,Working_hours, valid_time without overlaps))engine=innoDB default CHARSET utf8;

我插入以下值:

INSERT INTO Contracts (Employee_ID, Working_hours, Contract_Begin, Contract_End) VALUES (1, 100, '2024-05-01', '2024-08-31');

现在要将 6 月和 7 月的工作时间更新为值“145”,我执行以下操作:

update contracts  for portion of valid_time from '2024-06-01' to '2024-07-31' set Working_hours = 145 where Employee_ID = 1;

但是我对结果不满意。如果我查询:

select * from contracts; 

这就是我得到的:

"Event_ID","Employee_ID","Working_hours","Contract_Begin","Contract_End"
2,1,100,2024-05-01,2024-06-01
3,1,100,2024-07-31,2024-08-31
1,1,145,2024-06-01,2024-07-31

这里的问题是第一部分的结束日期(“2024-06-01”)等于更新部分的开始日期。因此,存在一天的重叠,如果我查询“2024-06-01”的工作时间,我会得到两个结果。然而,我的目标是完全不重叠。 working_hours = 145 应适用于整个范围“2024-06-01”到“2024-07-31”,之前部分的结束日期应设置为:“2024-05-31”以及开始日期更改后的部分应设置为:“2024-08-01” - 而不是“2024-07-31”。我认为这是一个非常标准的用例,只要在特定时间范围内只能有一个值。

sql mariadb temporal-tables
1个回答
0
投票

我喜欢使用这种模式:

WHERE dt >= '2024-06-01'
  AND dt  < '2024-06-01' + INTERVAL 1 DAY

请注意,

BETWEEN
包含在内。

请注意,该模式避免了闰日等的混乱。

© www.soinside.com 2019 - 2024. All rights reserved.