我有一堆datetime
值,我需要将日期部分替换为作为参数传递的特定日期(格式为nvarchar(8)
的{{1}})。时间部分应与以前保持一致。
例如,我有一行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'
我该怎么做?
答案 0 :(得分: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
答案 1 :(得分: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)
来实现)来执行此操作,但这些让我感到不安。