在sql中执行有效的日期记录

时间:2009-10-05 22:44:53

标签: sql sql-server sql-server-2008

假设我有一个名为“Name”的列的记录。每条记录都可以生效,因此我也有一个生效日期和到期日期栏。

“名称”列必须是唯一的,但仅限于生效日期和到期日的重叠期间。我正在寻找某种有效的方法来在sql后端执行此操作(我使用的是ms sql 2008)。

2 个答案:

答案 0 :(得分:4)

您可以使用INSERT/UPDATE trigger

该页面上的示例C与您需要的类似。 Inserted是一个伪表,您可以使用它将插入/更新的记录连接回您的表,以查看是否有任何其他日期重叠的记录,

答案 1 :(得分:0)

这是数据模型

Table A (

name char (32) not null,
effdt date not null,
effseq int not null,
effstatus char (1) not null,

other data columns ..

)

Primary_Key A_Key(name,effdt,effseq);

以下是数据:

'A', '1/1/2009', 1, 'A', 'Otherdata'
'A', '1/1/2009', 2, 'A', 'Otherdata 2'
'B', '1/1/2009', 1, 'A', 'B data'
'B', '1/1/2009', 2, 'I', 'B Data'

以下是规则:

使用Effdt存储应使用或有效行的日期。这可能不是存储/创建数据的日期。

使用Effseq在任何日期存储多个更新。它应始终以1开头。

使用EFFStatus取消激活数据。不要删除有效日期架构中的数据。删除也会使审计业务变得艰难。

当您“更新”一行时,永远不要更新EFFDT列。始终使用新的EFFDT创建一个新行。如果EFFDT已存在,请使用下一个EFFSEQ。

将updateuserid和updatetimestamp也存储在行中可能是个好主意。特别是如果你想跟踪变化。

以下是查询:

获取所有数据:

Select * from A

截至今天获得所有“活跃行”:

Select * from A A1
where effdt = (select max (EFFDT) from A where name= A1.name 
                                      and effdt <= getdate())
and effseq = (select max(effseq) from A where name=A1.name and effdt=A1.effdt)
and eff_status = 'A'

获取截至给定日期过去/未来的所有行:

将getdate()替换为上面的实际日期。

如果您正在编写Web应用程序,请参阅表单字段规则:

插入表单:

EFFDT : Editable, Default Value = Today
EFFSEQ : Non Editable, Default Value = "#Next". 
Interpret what is "Next" in the backend.

更新表单:

EFFDT : Editable, Default= current Value.
EFFSEQ : Non-Editable, Default = "#Next" 

删除表格:

All data non editable, On Delete Action, set EFF_STATUS='I'

历史编辑:

This is a "super user" feature only. 
EFFDT = Non Editable, Default is Current Date
EFFSEQ = Non-Editable, Default is Current Value

所有其他字段都可以编辑,并对该行进行真正的更新。