-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

我怎样才能做到这一点?

4

2 回答 2

4
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
于 2012-10-06T22:19:04.887 回答
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))它自己获取日期,然后通过上述计算的结果减去总日期并将它们添加到新日期来获取当天的毫秒数。

您也可以通过字符串操作或基于单个 datediff 的结果的假设来执行此操作(DATEADD(MILLISECOND, (DATEDIFF(MILLISECOND, 0, @Date1) % 8600000), @Date2)想到),但这些让我感到恶心。

于 2012-10-06T22:02:40.980 回答