У меня есть таблица в SQL Server, в которой хранится много записей со столбцами datetime. Я хочу изменить время с 08:30 до 00:00 на 08:00: 00 между датами 2017-06-01 и 2017-06-30.

Пример данных ниже:

ID      FIELD1   FIELD2    START_DATETIME             END_DATETIME
--------------------------------------------------------------------------------
18936     48       2       2017-06-01 19:00:00:000    2017-06-02 08:30:00:000
18937      5       2       2017-06-01 19:00:00:000    2017-06-02 08:30:00:000
18938      4       2       2017-06-01 19:00:00:000    2017-06-02 08:30:00:000
18939     46       2       2017-06-01 19:00:00:000    2017-06-02 08:30:00:000
18940     40       2       2017-06-02 08:30:00:000    2017-06-02 19:00:00:000
18941     16       2       2017-06-02 08:30:00:000    2017-06-02 19:00:00:000
18942     21       2       2017-06-02 08:30:00:000    2017-06-02 19:00:00:000

Спасибо.

1
Cafer Elgin 28 Май 2017 в 17:21

2 ответа

Лучший ответ

Я изменил свой ответ, так как вы хотите обновить данные в таблице.

--Change START_DATETIME
UPDATE yourTable --replace with your table name 
SET START_DATETIME =  (DATEADD(MINUTE, -30, START_DATETIME))
WHERE START_DATETIME > '2017-06-01'
      AND
      END_DATETIME < '2017-07-01'
      AND
      CAST(START_DATETIME AS TIME) = '08:30:00'
GO

--Change END_DATETIME
UPDATE yourTable --replace with your table name
SET END_DATETIME =  (DATEADD(MINUTE, -30, END_DATETIME))
WHERE START_DATETIME > '2017-06-01'
      AND
      END_DATETIME < '2017-07-01'
      AND
      CAST(END_DATETIME AS TIME) = '08:30:00'
GO
2
Jason 28 Май 2017 в 15:06

Вы можете использовать update. Для start_datetime это будет:

update t
    set start_datetime = dateadd(minute, -30, start_datetime)             
    where start_datetime >= '2017-06-01' and
          start_datetime < '2017-07-01' and
          cast(start_datetime as time) = '08:00:00';

Вы можете сделать что-то подобное с end_datetime. Или оба сразу:

update t
    set start_datetime = (case when cast(start_datetime as time) = '08:00:00'
                               then dateadd(minute, -30, start_datetime)
                               else start_datetime
                          end),
         end_datetime = (case when cast(end_datetime as time) = '08:00:00'
                              then dateadd(minute, -30, end_datetime)
                              else end_datetime
                          end)
    where start_datetime >= '2017-06-01' and
          start_datetime < '2017-07-01' and
          (cast(start_datetime as time) = '08:00:00' or
           cast(end_datetime as time) = '08:00:00'
          );

Это предполагает, что диапазон дат определяется start_datetime.

1
Gordon Linoff 28 Май 2017 в 14:28