【问题标题】:sql updating hour onlysql只更新小时
【发布时间】:2013-12-06 14:10:11
【问题描述】:

我有这样的数据:

DATE_CLOTURE
------------
2013-11-29 16:12:11.000
2013-11-29 08:12:11.000
2013-11-29 13:12:11.000
2013-11-29 11:12:11.000

我的预期

DATE_CLOTURE
------------
2013-11-29 18:00:00.000
2013-11-29 12:00:00.000
2013-11-29 18:00:00.000
2013-11-29 12:00:00.000

我的小想法是:

UPDATE [Soft8Exp_Server_44].[dbo].[LETTRE_VOIT_FINAL]
   SET [DATE_CLOTURE] = ??? here set 12

 WHERE datepart(hour,date_cloture) > 6 and datepart(hour,date_cloture) <= 12 

 UPDATE [Soft8Exp_Server_44].[dbo].[LETTRE_VOIT_FINAL]
   SET [DATE_CLOTURE] = ??? here set 18

 WHERE datepart(hour,date_cloture) > 12 and datepart(hour,date_cloture) <= 18 

【问题讨论】:

    标签: sql-server datetime sql-update


    【解决方案1】:

    这是一个解决方案,但它可能不干净(我喜欢使用 cast,但它可能不是最有效的)

    它与 sql server 2008 兼容(我认为之前不存在日期)

    select CAST(rtrim(cast(getdate() as date))+ ' 16:00:00' as datetime)
    

    我在 getdate 上使用 date 来仅保留日期,我使用 rtrim 将其转换为 char(这很糟糕,但写得很快)然后我将我的日期连接到一个日期时间。

    与其更新两次,不如只做一次,这样会更好

    【讨论】:

      【解决方案2】:

      试试这个:

      这将删除日期的时间部分:

      UPDATE LETTRE_VOIT_FINAL
      SET date_cloture = DATEADD(dd, 0, DATEDIFF(dd, 0, date_cloture))
      

      (找到方法here)

      然后您可以执行另一个 DATEADD 将您想要的小时数放在您想要的行中:

      UPDATE LETTRE_VOIT_FINAL
      SET date_cloture = CASE 
          WHEN datepart(hour, date_cloture) > 6
            AND datepart(hour, date_cloture) <= 12
            THEN DATEADD(hh, 12, DATEADD(dd, 0, DATEDIFF(dd, 0, date_cloture)))
          WHEN datepart(hour, date_cloture) > 12
            AND datepart(hour, date_cloture) <= 18
            THEN DATEADD(hh, 18, DATEADD(dd, 0, DATEDIFF(dd, 0, date_cloture)))
          END
      

      sqlfiddle demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多