如何根据日期插入

时间:2012-09-29 03:33:18

标签: sql-server insert sql-update

我有一个table table1(account,last_contact_date,insert_date),account和last_contact_date是主键。 insert_date设置为通过调用getdate()添加recored的时间。我还有一个临时表#temp(account,last_contact_date),我用它来更新table1。

以下是示例数据:

table1
account    last_contact_date    insert_date
1          2012-09-01           2012-09-28
2          2012-09-01           2012-09-28
3          2012-09-01           2012-09-28

#temp 
account    last_contact_date
1          2012-09-27
2          2012-09-27  
3          2012-08-01

结果表取决于插入日期。如果日期是2012-09-28,结果将是

table1
account    last_contact_date    insert_date
1          2012-09-27           2012-09-28
2          2012-09-27           2012-09-28
3          2012-09-01           2012-09-28

如果日期是2012-09-29,结果将是

table1
account    last_contact_date    insert_date
1          2012-09-01           2012-09-28
2          2012-09-01           2012-09-28
3          2012-09-01           2012-09-28
1          2012-09-27           2012-09-29
2          2012-09-27           2012-09-29

基本上规则是 (1)如果插入日期是同一天,我将选择最新的last_contact_date,否则, (2)如果last_contact_date晚于当前的last_contact_date,我将插入一个新的。

如何为此插入编写查询?

1 个答案:

答案 0 :(得分:1)

这不是一个插入物。它是基于某种逻辑的更新或插入。

所以,我推荐的是这个。

将所有记录转储到新的临时表中。您将按原样将表1中的记录转储到临时表中。您将把#temp帐户中的记录按原样转储到新临时表中,但将insert_date列设置为当前日期。

所以,你的新临时表看起来像这样:

#holding tank 
account    last_contact_date    insert_date
1          2012-09-01           2012-09-28
2          2012-09-01           2012-09-28
3          2012-09-01           2012-09-28
1          2012-09-27           2012-09-29
2          2012-09-27           2012-09-29
3          2012-08-01           2012-09-29

现在,删除table1中的所有记录。

接下来,将新记录插入表一。我们将使用GROUP来整理您的记录。这是示例代码,在这种情况下,会在某些条件下破坏您的主键,但您明白我的观点。按摩分组逻辑以满足您的需求:

Insert into Table1
select
   account,
   max(last_contact_date),
   insert_date
from
  #HoldingTank
group by
  account, insert_date

在我看来,这是唯一可以接受的方式。

我也非常肯定我在实践中永远不会遇到这种情况,因为它是一个破碎的设计。需要考虑一下这个数据库模式。将每个实体和事件存储在自己的表中。根据我对你的情况的有限了解,我在想Account,Account_Contact_Attempts。