我的数据库中有一行有三列,即
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'
那么,我将如何管理更新查询或其他任何方式来执行相同操作?
答案 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