将datetime值更新为相同日期但持续时间

con*_*att 6 sql sql-server

我处于这样一种情况,我想更新表中所有值的日期,以保持同一天,但保持每条记录的时间.

So these three dates...
8/28/2012 14:00:00
8/28/2010 12:00:00
8/28/2008 10:00:00

Should be turned into...
8/28/2012 14:00:00
8/28/2012 12:00:00
8/28/2012 10:00:00

UPDATE MySpecialTable
SET DateField = {...?};
Run Code Online (Sandbox Code Playgroud)

编辑: 无论一天的日期是(即2012年8月28日,1/1/2012,2012/4/1,等等),我想坚持的时间和大规模更新所有的日/月/年一个特定的价值.

Aar*_*and 6

DECLARE @Target DATETIME;
SET @Target = '20120828';

-- if the date is supposed to be today rather than hard-coded or parameterized:

-- SET @Target = DATEADD(DAY, DATEDIFF(DAY, '19000101', CURRENT_TIMESTAMP), '19000101');

UPDATE dbo.MySpecialTable
  SET DateField = DATEADD(DAY, DATEDIFF(DAY, DateField, @Target), DateField);
Run Code Online (Sandbox Code Playgroud)

如果目标日期在列中的值之前或之后,这将起作用.

此外,如果您只关心时间,则应考虑使用TIME数据类型(SQL 2008+).这样可以在查询时轻松地将您想要的任何日期应用于数据,而无需实际执行任何更新.