2014-03-31 68 views
0

我有一張包含我想要維護的演示數據的表。表中的數據包含日期時間,我想創建一個作業每晚運行以更新日期時間,以便日期時間永遠不會超過1周以前的日期,並且永遠不會有將來的日期時間,也不會是當前的日期時間。我希望在按日期時間排序時維護消息的順序,以便當我更新該列時,一行不會跳過另一列的青蛙。我不能拿出一個公式來做到這一點,沒有一些行最終在按日期時間排序時跳過。 有什麼建議嗎?用於在表中更新日期時間的SQL作業

我的問題是與公式。 如果日期爲星期二下午5點,向所有人添加一天仍然會使其成爲未來日期,如果日期爲星期二下午5點,我將添加1天,然後星期三早上5點星期三下午5點演示。 添加一天,但最近的一次可能會跳過下一個最近的日期,導致最近的消息在訂單中回退。

+0

你應該發佈你的數據看起來像現在和你期望的樣子。這很難形象化。您是否在設置工作或編寫查詢時遇到問題? – Brad

+2

如果這項工作每晚都在運行,爲什麼不給每個日期時間值添加1天? 'DATEADD(day,1,)'。然後一切都保持同步。或者,您是否無法識別需要更新的所有日期時間字段? –

+1

您是否在整個一天的表中插入新行,以及運行每晚更新?或者這是一組靜態的行,每晚更新一次,這就是全部? – Lee

回答

0

如果您目前有多個日期跨越一週以上,那麼通過簡單地爲每個日期添加時間將無法實現。如果記錄的時間框架無所謂,只是順序,最小值和最大值,我將與row_number函數的日期進行排序,並在幾秒鐘內添加排序號至1周前:

update t 
    set t.YourDateColumn = u.NewDate 
    from YourTable t 
     inner join (select ID, 
         dateadd(second, 
          row_number() over(order by YourDateColumn), 
          dateadd(week,-1,getdate())) NewDate 
        from YourTable 
        ) u 
      on u.ID = t.ID 

這將工作,如果你有多達604.8K的記錄。如果你不止這些,你將不得不增加毫秒。這將可以處理多達604.8M條記錄。

0

假設你使用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鏈接。

此外,更正公式以按正確順序對日期進行排序(前面的示例以所需的相反順序分配日期)。