Sql 将datetime值更新为相同的日期但保留时间

Sql 将datetime值更新为相同的日期但保留时间,sql,sql-server,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 = {...?}; 编辑:

我希望更新表中所有值的日期,使其具有相同的日期,但保留每个记录的时间

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日等),我都希望将时间和批量更新全天/月/年保留为特定值

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);
如果目标日期在列中的值之前或之后,则此操作有效


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

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

update MySpecialTable
    set DateField = cast(CURRENT_TIMESTAMP as date) + (DateField - cast(DateField as date))
尝试此操作(更新为具有相同的日期):

  • DATEADD(Day,0-DATEDIFF(Day,0,[DateField]),[DateField])
    获取 时间戳并将日期设置为最小值(1/1/1900)
  • 将上述内容添加到变量中的所需日期

日期是今天,对吗?这是要求吗?这是一次性的,还是需要重复的过程?如果是后者,那么日期将始终是“2012-08-28”还是“今天”。如果您只更新任何一年8月28日的行,我也会在您的要求中指定,或者,如果您试图更新所有行以显示其持续时间为今年8月28日。如果任何行在不同年份中不在同一日期,则不会更新日期。您是对的。我一提交答案就意识到了这一点。我也会小心使用
YYYY-MM-DD
-用
SET语言法语试试例如(还有许多其他情况下它会断裂)。yyyy-mm-dd符合国际ISO 8601日期标准。将语言设置为法语或其他语言并没有破坏结果。只要yyyy被解释为年份,SQL Server就会忽略所有区域性设置。检查这个链接我想你没有试过。对我来说,它中断了,因为yyyy-mm-dd实际上在该语言中被解释为yyyy-dd-mm。它是否符合ISO 8601是另一个问题:更相关的是SQL Server并非在所有情况下都遵守ISO 8601,因此不要假设遵循ISO 8601将始终生成无误的代码。
DECLARE @myDate DATETIME
SET @myDate = '2012-08-28T00:00:00.000'
UPDATE [MySpecialTable]
   SET [DateField] = DATEADD(Day, 0-DATEDIFF(Day, 0, [DateField]), [DateField]) + @myDate