sql只更新小时

时间:2013-12-06 14:10:12

标签: sql-server datetime sql-update

我有这样的数据:

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 

2 个答案:

答案 0 :(得分:0)

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

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

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

我在我的getdate上使用日期只保留日期,我使用rtrim作为char进行转换(这很糟糕,但很快写入)然后我将日期连接到日期时间。

而不是2更新,只做一个有案例的时候,它更好

答案 1 :(得分:0)

试试这个:

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

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