【问题标题】:Update only time from my Datetime field in sql仅从 sql 中的 Datetime 字段更新时间
【发布时间】:2013-03-29 09:11:08
【问题描述】:

我的表中有一个日期 2013-12-14 05:00:00.000。

现在我只想更新那个日期的时间。例如到 2013-12-14 04:00:00.000

是否有任何查询仅更新日期时间字段中的时间?

【问题讨论】:

  • 在 SQL Server 2008 中,如果您需要单独更新时间部分,如果将​​时间部分单独存储在 TIME 列中会容易得多。跨度>
  • @marc_s 如果您使用的是 ORM 实现,这会不会很痛苦,因为您需要一个连接两个字段的视图?这可能与上面的问题无关,我只是好奇:)
  • 您没有提供足够的信息来了解问题所在。为什么不能将列的值更新为2013-12-14 04:00:00.000?或者您想将时间值设置为 04:00 而不管它是什么日期?或者您想从当前时间中减去一小时还是...?
  • 我有很多行具有相同的值

标签: sql sql-server-2008


【解决方案1】:
UPDATE MyTable 
SET MyDate = DATEADD(HOUR, 4, CAST(CAST(MyDate AS DATE) AS DATETIME)) 

或者这个

UPDATE MyTable 
SET MyDate = DATEADD(HOUR, 4, CAST(FLOOR(CAST(MyDate AS FLOAT)) AS DATETIME))

【讨论】:

    【解决方案2】:

    使用下面的更新时间只为datetime 列 -

    select  CONVERT(varchar(10),datecolumn, 120) + ' 12:34:56', 
            CONVERT(varchar(10),datecolumn, 120) + ' 00:00:00', 
            RSLV_LTR_INITIAL_DUE_DT, *
    from twhere able1       
    

    【讨论】:

      【解决方案3】:
      UPDATE TABLE_NAME SET DATETIME_FIELD = CAST(CAST(CONVERT(DATE, DATETIME_FIELD,101) AS VARCHAR) + ' 2' + ':' +  '22' AS DATETIME) WHERE (OUR_CONDTTION)
      

      【讨论】:

        【解决方案4】:
        DECLARE @Time as TIME;
        DECLARE @Date as DATETIME;
        
        SELECT @Time = CONVERT(TIME, '2016-01-01 09:30:00.000');
        SELECT @Date = CONVERT(date, GETDATE()); --2017-03-10 16:37:34.403
        
        SELECT DATEADD(MINUTE, DATEPART(MINUTE, @Time), DATEADD(HH, DATEPART(HOUR, @Time), @Date))
        

        输出: 2017-03-10 09:30:00.000

        【讨论】:

          【解决方案5】:

          如果只是更新日期时间的特定部分,您可以使用SMALLDATETIMEFROMPARTS,例如:

          UPDATE MyTable 
          SET MyDate = SMALLDATETIMEFROMPARTS(YEAR(MyDate), MONTH(MyDate), DAY(MyDate), <HoursValue>, <MinutesValue>) 
          

          在其他情况下,可能需要将部分日期时间复制到其他部分或仅更新日期时间的某些部分:

          UPDATE MyTable 
          SET MyDate = SMALLDATETIMEFROMPARTS(YEAR(MyDate), MONTH(MyDate), DAY(MyDate), DATEPART(hour, MyDate), DATEPART(minute, MyDate)) 
          

          更多此类功能请参考SQL Server Date/Time related API references

          【讨论】:

          • 还有DATETIMEFROMPARTS,可以设置秒和毫秒。
          【解决方案6】:

          用它来改变字符串的整个时间部分:

          UPDATE MyTable SET MyColumn = DATEADD(DAY, DATEDIFF(DAY, 0, MyColumn), '04:00:00')
          

          【讨论】:

            【解决方案7】:
            DECLARE @d datetime;
            SELECT @d = DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0);
            
            DECLARE @t time(7);
            SET @t = CAST('10:10:10' AS time);
            
            SELECT CONVERT(datetime, CONVERT(varchar(10), CONVERT(date, @d, 101)) + ' ' + CONVERT(varchar(8), @t));
            

            【讨论】:

              【解决方案8】:

              使用这个脚本:

              declare @curDate datetime=getdate() --or any other datetime 
              declare @time time='22:31'
              declare @hour int ,@min int
              set @hour=datepart(hh,@time)
              set @min=datepart(mm,@time)
              select @curDate=Dateadd(HOUR,@hour,convert(datetime,convert(Date,@curDate)))
              select @curDate=Dateadd(MINUTE,@min,@curDate)
              Select @curDate
              

              【讨论】:

                【解决方案9】:

                上一个查询仅更新小时部分,但此查询将更新时间的所有部分,即小时、分钟、秒:

                UPDATE TABLE_NAME
                SET DATETIME_FIELD = CONCAT(CAST(DATETIME_FIELD AS Date), ' ', CAST('2016-02-01 09:20:00.0000000' AS TIME))
                

                【讨论】:

                • 我希望我的编辑符合您的意图 - 您会注意到我从评论中复制了您的解释并将代码放入代码块中。为了将来参考,您可以点击帖子下方的“编辑”链接自行完成。
                猜你喜欢
                • 1970-01-01
                • 2011-08-08
                • 2017-09-19
                • 1970-01-01
                • 1970-01-01
                • 2011-03-09
                • 1970-01-01
                • 1970-01-01
                • 2021-08-31
                相关资源
                最近更新 更多