[SQL]將今年初的日期時間欄位的資料改成去年底日期時間,並維持資料原本日期時間的順序

將今年初的日期時間欄位的資料改成去年底日期時間,並維持資料原本日期時間的順序

今天同事想要將2014年1月多的日期時間欄位的資料改成2013年底的日期時間資料,並保持資料的原本日期時間的順序不變,如下,

orgdt
-----------------------
2014-01-09 13:54:32.290
2014-01-09 13:54:32.290
2014-01-13 10:53:55.990
2014-01-13 10:53:56.007

 

改成類似如下的結果
newdt
-----------------------
2013-12-31 08:00:01
2013-12-31 08:00:02
2013-12-31 08:00:03
2013-12-31 08:00:04

 

所以看起來是某個日期時間再加上序號即可,如下,


--SQL 2005 之後可使用CTE
WITH    org_data_sn
AS ( 
	SELECT   ROW_NUMBER() OVER ( ORDER BY orgdt ) AS sn ,
            orgdt
    FROM     #org_data
    )
SELECT  * ,
DATEADD(second, sn, '2013/12/31 08:00') AS newdt
FROM    org_data_sn

--SQL 2K 使用temp table來處理
--1.透過identity欄位來產生序號
CREATE TABLE #tmp_data
(
orgdt DATETIME
, sn INT IDENTITY(1,1)
);
--2.將原始資料排序後存入temp table之中
INSERT INTO #tmp_data (orgdt)
SELECT orgdt
FROM #org_data
ORDER BY orgdt;
--3.新欄位的值就是舊日期時間再加上序號即可

SELECT  * ,
DATEADD(second, sn, '2013/12/31 08:00') AS newdt
FROM #tmp_data

--有了這樣的資料,就可以跟原本的資料表,依舊的日期時間來Join,然後Update成新的日期時間
--UPDATE A
--SET orgdt = newdt
--FROM MyFakeTable A, #tmp_data B
--WHERE A.orgdt = B.orgdt 

--清除資料
DROP TABLE #tmp_data;
DROP TABLE #org_data;

image

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^