【问题标题】:Update date only in SQL Server [duplicate]仅在 SQL Server 中更新日期 [重复]
【发布时间】:2013-12-06 19:03:56
【问题描述】:

我的数据库表中有这一行,其值为1/5/2013 5:50:00 PM,我只想更新日期部分。时间应该是一样的,没有任何变化,只需要改变这条记录中的日期。

我已经尝试过更新语句,但它也改变了时间..但我可以做一个

UPDATE table1
SET date = '1/10/2013 5:50:00 PM'
WHERE id =1

这不是我要找的,不同的 id 有不同的时间,所以只需要更新日期以保持该记录中的时间相同。

请提供反馈。

谢谢

【问题讨论】:

  • 哪个 SQL Server 版本?

标签: sql sql-server sql-server-2005


【解决方案1】:

如果您使用的是 SQL Server 2008 或更高版本,则可以这样做

UPDATE table1
SET [date] = cast('1/10/2013' as datetime) + cast(cast([date] as time) as datetime)
WHERE id =1

如果您使用的是 SQL Server 2005 或更低版本,则没有 time 数据类型,因此您必须这样做:

UPDATE table1
SET [date] = cast('1/10/2013' as datetime) + ([date] - DATEADD(dd, 0, DATEDIFF(dd, 0, [date])))
WHERE id =1

【讨论】:

  • 我使用的是 SQL Server 2005
  • 更新了我 2005 年的答案。
  • 好的,我现在试试
【解决方案2】:
UPDATE table1
SET date = DATEADD(dd,5,date)-- 5 is the number of days
FROM table1
WHERE id =1

【讨论】:

  • 这个只适用于添加吧?有时我想更改日期、月份和年份。该怎么做?
  • 使用DATEDIFF 查找天数差异并将该值传递给DATEADD
  • @user3073987:你有没有费心看SQL Server Books Online documentation for DATEADD???您可以轻松地看到您可以在几天、几个月、几年、几秒钟、几分钟内执行此操作 - 无论您喜欢什么。学习查找和阅读文档!
【解决方案3】:

不是最优雅的,但应该可以。想法是从目标行中提取小时、分钟和秒,并对其他部分进行硬编码。

update table1 set date = DATEADD(second, DATEPART(second, date), DATEADD(minute, DATEPART(minute, date), DATEADD(hour, DATEPART(hour,date), '2013-01-10')));

【讨论】:

    【解决方案4】:

    虽然在外观上有点骇人听闻,但如果您只想用任意值更改日期部分,而根本不触及时间部分,这将可以解决问题:

    update table1 set date= '06-dec-2013 ' + cast(datepart(HOUR,date) as varchar(2)) + ':' + 
    cast(datepart(MINUTE,date) as varchar(2)) + ':' +
    cast(DATEPART(SECOND, date) as varchar(2)) + ' ' +
    CASE WHEN DATEPART(HOUR, date) < 12 THEN 'AM' ELSE 'PM' END as datetime
    where id=1
    

    将 '06-dec-2013' 替换为您要替换的日期值。

    【讨论】:

      【解决方案5】:
      create table t
      (
      col1 datetime
      )
      
      Insert Into t 
      values ('1/5/2013 5:50:00 PM')
      
      
      
      declare @newDate datetime
      
      set @newDate = '1/10/2013'
      
      update t
      Set col1 = convert(datetime,DateAdd(day, DateDiff(day, col1, @newDate), Col1),101)
      

      sql-fiddle demo

      【讨论】:

        【解决方案6】:

        这是您想要的查询:

        declare @TargetDate datetime
        set @TargetDate = '20131001' --1st October 2013
        
        update table1 set [date] = DATEADD(day,DATEDIFF(day,[date],@TargetDate),[date])
        where id = 1
        

        这里有一个完整的脚本来演示它:

        declare @t table (dt datetime not null)
        insert into @t (dt) values
        ('2001-01-01T10:53:44.993'),('2012-06-18T15:33:33.333')
        
        declare @TargetDate datetime
        set @TargetDate = '20131001' --1st October 2013
        
        update @t set dt = DATEADD(day,DATEDIFF(day,dt,@TargetDate),dt)
        
        select * from @t
        

        结果:

        dt
        -----------------------
        2013-10-01 10:53:44.993
        2013-10-01 15:33:33.333
        

        这通过使用DATEDIFF 计算出目标日期与表中存储的每个日期相差多少天(带有适当的标志),然后将该差异添加回日期 - 具有调整日期的效果部分存储值,同时不影响时间。

        【讨论】:

          猜你喜欢
          • 2014-12-04
          • 1970-01-01
          • 1970-01-01
          • 2014-11-12
          • 2012-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多