Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как изменить время на 1 час у части записей таблицы  [new]
Malyav
Member

Откуда:
Сообщений: 183
Есть поле DateTime с типом smalldatetime, данные в котором хранятся в виде

01.12.2013 02:00:00
01.12.2013 02:15:00
01.12.2013 02:30:00
01.12.2013 02:45:00

надо с определенной даты, например с 01.08.2014 00:00:00 уменьшить время на один час у всех записей в определенной таблице, например с именем MyTableName. Вообще, таких таблиц много и мне надо будет проделать это для каждой.

У меня MS SQL Server 2000 MSDE.
Спасибо.
12 янв 15, 08:28    [17104150]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить время на 1 час у части записей таблицы  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
update TableName set FieldName = DATEADD(HH,-1,FieldName)
where FieldName >= '01.08.2014 00:00:00 ' -- с определенной даты
12 янв 15, 08:35    [17104165]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить время на 1 час у части записей таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
LexusR
update TableName set FieldName = DATEADD(HH,-1,FieldName)
where FieldName >= '01.08.2014 00:00:00 ' -- с определенной даты
Лучше '20140801'
12 янв 15, 09:28    [17104254]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить время на 1 час у части записей таблицы  [new]
Malyav
Member

Откуда:
Сообщений: 183
iap
Лучше '20140801'

Не успел, сделал по примеру LexusR.
Еще пришлось удалить четыре записи (потому что каждая новая создается раз в 15 минут) за час, предшествующий началу сдвига.

Поскольку у меня 80 таких таблиц и прогонять каждую вручную было лень, я написал процедуру (может пригодится кому)

USE [MyDataBase]
GO
/****** Object:  StoredProcedure [dbo].[spChangeTime]    Script Date: 01/12/2015 11:44:21 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[spChangeTime] 
@TableName char(30)
as

DECLARE @ct nvarchar(1000);

SET @ct = '
Delete from ' + @TableName + ' where [DateTime] BETWEEN ''01.11.2014 00:00:00'' AND ''01.11.2014 00:45:00'';
Update ' + @TableName + ' set [DateTime] = DATEADD(HH,-1,[DateTime])
Where [DateTime] >= ''01.11.2014 01:00:00'' 
'
exec sp_executesql @ct


и выполнил ее для всех таблиц.

EXECUTE [MyDataBase].[dbo].[spChangeTime] 'MyTableN'




Большое спасибо за помощь.
12 янв 15, 09:55    [17104371]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить время на 1 час у части записей таблицы  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3646
вот как надо на зимнее время переходить :)
12 янв 15, 10:14    [17104465]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить время на 1 час у части записей таблицы  [new]
ART-CODE
Member

Откуда:
Сообщений: 1092
Malyav
у меня 80 таких таблиц

Не вижу, где в хранимке spChangeTime
выполняется перебор этих таблиц.
Вручную, что-ли ?

Вариант автоматизации:
+

  declare @Script varchar (max)
  set @Script=''
  
  select top 1000  -- надеюсь, таблиц меньше этого значения
  @Script=@Script+'Delete from ['+TABLE_CATALOG+'].['+TABLE_SCHEMA+'].['+TABLE_NAME+'] where [DateTime] BETWEEN convert(datetime,''2014-11-01 00:00:00'',120) AND convert(datetime,''2014-11-01 00:45:00'',120); '+CHAR(13)+CHAR(10)
                 +'Update ['+TABLE_CATALOG+'].['+TABLE_SCHEMA+'].['+TABLE_NAME+'] set [DateTime] = DATEADD(HH,-1,[DateTime]) Where [DateTime] >= convert(datetime,''2014-11-01 01:00:00'',120); '+CHAR(13)+CHAR(10) 
  from information_schema.columns 
  where DATA_TYPE='datetime' 
 and COLUMN_NAME='DateTime'
 and TABLE_CATALOG='MyDataBaseName' -- укажите Вашу базу
  
  select @Script
 -- exec(@Script)
-- раскомментировать для выполнения

12 янв 15, 13:55    [17105841]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить время на 1 час у части записей таблицы  [new]
Malyav
Member

Откуда:
Сообщений: 183
ART-CODE
Malyav
у меня 80 таких таблиц

Не вижу, где в хранимке spChangeTime
выполняется перебор этих таблиц.
Вручную, что-ли ?


Изменение времени надо было делать только для таблиц с полем DateTime и выбирать эти таблицы я посчитал проще вручную, чем в процедуре. Я не настолько силен в SQL :-) . Поэтому я выбрал по маске (имена таблиц начинаются с определенной комбинации букв) нужные мне таблицы и в экселе сформировал список запросов типа
EXECUTE [MyDataBase].[dbo].[spChangeTime] 'MyTableN'
. Это заняло секунд 20. Потом прогнал все эти запросы пачкой.
На создание Вашего кода в процедуре у меня ушло бы намного больше времени. Но все равно спасибо!
12 янв 15, 14:23    [17106021]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить