【问题标题】:Update datetime values to same date but persist time将日期时间值更新为相同的日期但保持时间
【发布时间】:2012-08-28 15:13:00
【问题描述】:

我想更新表中所有值的日期以具有相同的 day 但保留每条记录的 time .

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 日等),我都想坚持时间和大规模更新所有日/月/年到特定值。

【问题讨论】:

  • 日期是今天,对吧?这是要求吗?这是一次性的,还是需要重复的过程?如果是后者,日期将始终为“2012-08-28”还是始终为“今天”。
  • 我还会在您的要求中指定您是否尝试仅更新任何一年的 8 月 28 日的行,或者您是否尝试更新 all行来显示他们在今年 8 月 28 日的持续时间。

标签: sql sql-server


【解决方案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);

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      试试这个(更新到相同的日期):

      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)
      • 将上述内容添加到变量中所需的日期

      【讨论】:

      • 如果任何行不在不同年份的同一日期,这将不会更新日期。
      • 你是对的。我一提交答案就意识到了这一点。会更新的。
      • 我也会小心YYYY-MM-DD - 例如,尝试使用SET LANGUAGE FRENCH;(还有许多其他情况会中断)。
      • yyyy-mm-dd 符合国际 ISO 8601 日期标准。将语言设置为法语或其他任何内容都不会破​​坏结果。只要 yyyy 被解释为年份,SQL Server 就会忽略所有文化设置。检查此MSDN 链接
      • 我认为你没有尝试过。它对我来说很糟糕,因为 yyyy-mm-dd 实际上在该语言中被解释为 yyyy-dd-mm 。它是否符合 ISO 8601 是一个不同的问题:更相关的是 SQL Server 并非在所有情况下都遵守 ISO 8601,所以不要假设遵循 ISO 8601 总是会产生无误的代码。
      猜你喜欢
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多