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

时间:2012-08-28 15:13:00

标签: 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 = {...?};

编辑:无论日期是什么日期(即2012年8月28日,2012年1月1日,2012年4月1日等),我都希望保持时间和批量更新所有日/月/年到特定值。

3 个答案:

答案 0 :(得分: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);

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

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

答案 1 :(得分:0)

这是一种方法,假设您使用的是SQL Server 2008或更高版本:

update MySpecialTable
    set DateField = cast(CURRENT_TIMESTAMP as date) + (DateField - cast(DateField as date))

答案 2 :(得分:0)

尝试此操作(已更新为具有相同日期):

DECLARE @myDate DATETIME
SET @myDate = '2012-08-28T00:00:00.000'
UPDATE [MySpecialTable]
   SET [DateField] = DATEADD(Day, 0-DATEDIFF(Day, 0, [DateField]), [DateField]) + @myDate
  • DATEADD(Day, 0-DATEDIFF(Day, 0, [DateField]), [DateField])得到了 时间戳并将日期设为最小值(1/1/1900)
  • 将上述内容添加到变量
  • 中的所需日期