替换datetime值的日期部分

时间:2012-10-06 21:52:06

标签: sql sql-server sql-server-2008

我有一堆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'

我该怎么做?

2 个答案:

答案 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)来实现)来执行此操作,但这些让我感到不安。

相关问题