Я согласен с комментарием, что, возможно, не стоит делать это автоматически и скрытно, но если вы хотите, вы можете использовать это.
(обратите внимание, что предполагается, что SQL Server)
select T.Name, C.Name
from sys.tables T
join sys.columns C
on T.object_id = C.object_id
and C.system_type_id = 61 -- I would do a little researcht o make sure 61 is all you need to return here
Это даст вам список всех столбцов даты и времени вместе с таблицей, в которой он находится по имени.
Тогда я бы сделал так, чтобы у меня был курсор, который на лету строит строки обновления и исполняет их примерно так:
DECLARE @UpdateString varchar(500)
DECLARE @DaysToAdd int
DECLARE @TableName VARCHAR(100)
DECLARE @ColumnName VARCHAR(100)
set @DaysToAdd = 10
DECLARE db_cursor CURSOR FOR
select T.Name, C.Name
from sys.tables T
join sys.columns C
on T.object_id = C.object_id
and C.system_type_id = 61
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @TableName, @ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
set @UpdateString = 'Update ' + @TableName + ' set ' + @ColumnName + ' = dateadd(dd, ' + cast(@DaysToAdd as varchar) + ', ' + @ColumnName + ') where ...'
exec(@UpdateString)
FETCH NEXT FROM db_cursor INTO @TableName, @ColumnName
END
CLOSE db_cursor
DEALLOCATE db_cursor
Есть много вещей, которые мне не нравятся в этом: курсор, тот факт, что он за кадром, и вызов exec, и я не уверен, как вы будете «обновлять только тестовые данные», поскольку очень трудно написать предложение where для общей таблицы в вашей базе данных. Но я думаю, что это поможет вам начать.
С другой стороны, возможно, вам стоит подумать о наличии сценария заполнения тестовых данных, который вы можете запустить, чтобы вставить новые данные, удовлетворяющие вашим требованиям к дате.