根据输入的日期更新数据库

时间:2013-11-30 08:44:40

标签: mysql sql sql-server date

我的数据库中有一行有三列,即

  

start_date = 2013-12-1
  end_date = 2013-12-31
  status ='a'

我想通过添加新记录来更改日期状态

  

start_date = 2013-12-10
  end_date = 2013-12-20
  status ='u'

在这种情况下,我可以轻松更新数据库,更新的数据库将是 -

1)start_date = 2013-12-1
end_date = 2013-12-9
status = 'a'
2)start_date= 2013-12-10
end_date = 2013-12-20
status = 'u'
3)start_date = 2013-12-21
end_date = 2013-12-31
status = 'a'

但是当我再次想要更改日期的状态时:

  

start_date = 2013-12-15
  end_date = 2013-12-25
  status ='a'

所以,我希望在我的数据库中有这样的结果

1)start_date = 2013-12-1
end_date = 2013-12-9
status = 'a'
2)start_date = 2013-12-10
end_date = 2013-12-14
status = 'u'
3)start_date = 2013-12-15
end_date = 2013-12-25
status = 'a'
4)start_date = 2013-12-26
end_date = 2013-12-31
status = 'a'

那么,我将如何管理更新查询或其他任何方式来执行相同操作?

2 个答案:

答案 0 :(得分:2)

目前,您在数据库细分时段中有代表 比如[DateFrom,DateTo,status]。事情变得复杂了 当您的细分重叠时我的建议是 你用这种方式代表[日期,状态]。一年刚刚 365-366天,所以没有那么多的数据存储 (实际上它对于一个严肃的RDBMS来说并不算什么。)

如果您代表每个日期,对您来说会更容易 作为数据库中的单独行。那你就需要 将某些日期更新为“u”,将其他日期更新为“a”状态。 但是您的更新查询会更简单。

答案 1 :(得分:1)

诀窍是找到插入记录的位置,例如:

record   start date    end date    status
1        2013-12-1     2013-12-9   'a'
                  <-- the new record goes here (2013-12-15     2013-12-25    'a')
2        2013-12-10    2013-12-20  'u'
3        2013-12-21    2013-12-31  'a'

您可以通过将新开始日期与现有开始日期进行比较来获得该位置

$new_start_date = '2013-12-15';
$new_end_date   = '2013-12-25';

$result_before =  $mysqli->query('SELECT ... WHERE end_date < "$new_start_date"
                   ORDER BY end_date DESC LIMIT 1");
$result_after =  $mysqli->query('SELECT ... WHERE start_date < "$new_start_date"
                   ORDER BY end_date LIMIT 1");

我遗漏了查询处理的确切细节。您可以填写详细信息。

这将为您提供记录1和2,您现在知道必须在2之间插入记录。您现在可以更新记录2,并插入新记录。

INSERT INTO table SET 
   start_date = DATE_ADD($result_before_end_date, INTERVAL 1 DAY) ,
    end_date  = $new_end_date

UPDATE table SET 
   start_date = DATE_ADD($new_end_date, INTERVAL 1 DAY) 
WHERE record = $result_after_record_id