2012-10-06 82 views
-3

我有一堆datetime值,我需要用作爲參數傳遞的特定日期(nvarchar(8)格式爲YYYYMMDD)替換日期部分。時間部分應該保持與以前一樣。替換日期時間值的日期部分

舉例來說,我已經得到了datetime值的該行:

Id | DocDate     | CreationDate   | PrintDate 
1 | 2012-10-01 00:44:20.150 | 2012-10-07 00:44:20.150 | 2012-10-07 00:50:20.150 

如果我傳遞'20121005',該值應該改變這樣的:

Id | DocDate     | CreationDate   | PrintDate 
1 | 2012-10-05 00:44:20.150 | 2012-10-05 00:44:20.150 | 2012-10-05 00:50:20.150 

我怎麼能這樣做?

回答

3
DECLARE @T TABLE (id int, docdate datetime, 
        creationdate datetime, 
        printdate datetime); 
INSERT @t SELECT 
1, '2012-10-01 00:44:20.150', 
    '2012-10-07 00:44:20.150', 
    '2012-10-07 00:50:20.150'; 

DECLARE @newdate datetime = '20121005'; 

UPDATE @T SET 
    docdate = dateadd(d,datediff(d,docdate,@newdate),docdate), 
    creationdate = dateadd(d,datediff(d,creationdate,@newdate),creationdate), 
    printdate = dateadd(d,datediff(d,printdate,@newdate),printdate); 

SELECT * FROM @t; 

改變,你需要申請日期時間的只是日期部分是先找到差異(天數)的模式,然後應用它。

e.g. datediff(d, '20121001', '20121008') => +7 days 
     dateadd(d, <+7>, '20121001 xx:xx') => add the 7 days, keeping time 
+0

創意......我喜歡它。 – Mitch

+0

@RichardTheKiwi tnx –

0

我會坦率地說,我不知道我是否正在回答您正在尋找答案的問題。嘗試下一次稍微詳細一點。這就是說,使用dateadd。

DECLARE @Date1 datetime, 
     @Date2 datetime 

set @Date1 = '2012-01-01 16:53:20.150' 
set @Date2 = '2012-10-06' 

SELECT @Date1 as Original, @Date2 as NewDate, DATEADD(MILLISECOND, DATEDIFF(MILLISECOND, DATEADD(day, 0, DATEDIFF(day, 0, @Date1)), @Date1), @Date2) as Updated 

產地:

Original    NewDate     Updated 
----------------------- ----------------------- ----------------------- 
2012-01-01 16:53:20.150 2012-10-06 00:00:00.000 2012-10-06 16:53:20.150 

(1 row(s) affected) 

基本上,使用DATEADD(day, 0, DATEDIFF(day, 0, @Date1))獲得通過自身的日期,然後通過上面的計算結果減去總日獲得的毫秒數成的那一天,並添加他們到新的日期。

你也可以通過字符串操作來執行此操作,或者基於單個日期的結果進行假設(但想到的是DATEADD(MILLISECOND, (DATEDIFF(MILLISECOND, 0, @Date1) % 8600000), @Date2)),但這些讓我感到不安。

相關問題