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))
尝试此操作(更新为具有相同的日期):
获取 时间戳并将日期设置为最小值(1/1/1900)DATEADD(Day,0-DATEDIFF(Day,0,[DateField]),[DateField])
- 将上述内容添加到变量中的所需日期
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