假設你使用MySQL,因爲你沒有指定(不過相同的技術應該可以幾乎任何地方,確切的語法和使用的功能會有所不同)
鑑於這樣
表結構
CREATE TABLE T (
id int auto_increment primary key,
detail varchar(20),
date datetime
);
INSERT INTO T
(detail, date)
VALUES
('one', NOW()),
('two', DATE_SUB(NOW(), INTERVAL 1 day)),
('three', DATE_SUB(NOW(), INTERVAL 2 day)),
('four', DATE_SUB(NOW(), INTERVAL 3 day)),
('five', DATE_SUB(NOW(), INTERVAL 4 day));
您可以按正確的順序選擇所有行,並在過程的前一週均勻地重新分配日期。像這樣:
SELECT
T.*,
DATE_SUB(NOW(), INTERVAL 6.048e+11*(1-(@row := @row + 1)/@tot) MICROSECOND) as newDate
FROM
T,
(SELECT @row := 0, @tot := (select count(*) from T)) r
ORDER BY
date;
注:6.048e+11
是一週內的微秒數。
下面是一個例子:http://sqlfiddle.com/#!2/939bc/5
所以,你可以使用投影創建臨時表,然後刪除原始表,並從該值在臨時表中重新創建它。是這樣的:
create temporary table T2 as (
select
T.*,
DATE_SUB(NOW(), INTERVAL 6.048e+11*(1-(@row := @row + 1)/@tot) MICROSECOND) as newDate
from T, (SELECT @row := 0, @tot := (select count(*) from T)) r
order by date
);
drop table T;
create table T as (select id, detail, newDate as date from T2);
更新: 改變了上述實施例使用MICROSECOND粒度,如上面的實施例中使用分數間隔DAY
,其MySQL的似乎不支持。我也相應地更新了sqlfiddle鏈接。
此外,更正公式以按正確順序對日期進行排序(前面的示例以所需的相反順序分配日期)。
你應該發佈你的數據看起來像現在和你期望的樣子。這很難形象化。您是否在設置工作或編寫查詢時遇到問題? – Brad
如果這項工作每晚都在運行,爲什麼不給每個日期時間值添加1天? 'DATEADD(day,1,)'。然後一切都保持同步。或者,您是否無法識別需要更新的所有日期時間字段? –
您是否在整個一天的表中插入新行,以及運行每晚更新?或者這是一組靜態的行,每晚更新一次,這就是全部? – Lee