6

我处于一种情况,我想将表中所有值的日期更新为同一天,但保留每条记录的时间

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 日等),我都希望将时间和批量更新全天/月/年持续到一个特定的值。

4

3 回答 3

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 数据类型(SQL 2008+)。这将使您可以在查询时轻松地将您想要的任何日期应用于数据,而无需实际执行任何更新。

于 2012-08-28T15:18:25.193 回答
0

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

update MySpecialTable
    set DateField = cast(CURRENT_TIMESTAMP as date) + (DateField - cast(DateField as date))
于 2012-08-28T15:20:21.873 回答
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)
  • 将以上内容添加到变量中的所需日期
于 2012-08-28T15:22:25.113 回答