2013-12-06 3 views
1

у меня есть данные, как это:SQL обновление час только

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 

ответ

0

Вот решение, но это, возможно, не чист (мне нравится работать с литой, но это, пожалуй, не самый эффективный)

Это SQL Server 2008 совместимый (я думаю, что дата не существовал до того)

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

Я использую дату на моем GETDATE только сохранить дату, я использую RTRIM бросить в символьном (это плохо, но быстро написал), тогда я соединяю дату с датой.

Вместо 2 обновления, сделать только один со случаем, когда это лучше

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

Смежные вопросы