патч datetime в столбце varchar - PullRequest
       0

патч datetime в столбце varchar

0 голосов
/ 28 февраля 2012

У меня есть около 12 таблиц, мне нужно перебрать и обновить все поля даты и времени (это тип varchar), проверить, является ли это датой, и если да, добавить 5 часов для учета корректировки utc или, если это недопустимая дата, просто установите ее к нулю. Ниже приведен шаблон, который я придумал. Просто интересно, есть ли другие способы сделать это?

update Tables_1
set releasedate = CASE ISDATE(releasedate) 
                     WHEN 1 THEN DATEADD(HH, 5, releasedate) 
                     ELSE NULL 
                  END,
    returndate = CASE ISDATE(returndate)
                     WHEN 1 THEN DATEADD(HH, 5, returndate) 
                     ELSE NULL 
                 END

дано: sql server 2008, я уже знаю столбцы и таблицы, в которых тип datetime хранится как varchar.

бонус просьба добавить еще один чек. Если это дата, а время не указано, установите время 5:00 AM

1 Ответ

1 голос
/ 28 февраля 2012

Если все они заканчиваются на date, вы можете построить его динамически:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += ', ' + name = CASE ISDATE(' + name + ') WHEN 1 THEN 
      DATEADD(HOUR, 5, ' + name + ' ELSE NULL END'
FROM sys.columns 
WHERE name LIKE '%date' AND [object_id] = OBJECT_ID('dbo.Tables_1');

SELECT @sql = 'UPDATE dbo.Tables_1 SET ' + STUFF(@sql, 1, 1, N'');

PRINT @sql;
-- EXEC sp_executesql @sql;

Теперь, если вы хотите сделать это для 12 таблиц, вы можете просто сделать это в цикле, например,

DECLARE @t SYSNAME, @sql NVARCHAR(MAX);

DECLARE c CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR 
  SELECT name FROM sys.tables 
  WHERE name IN ('Tables_1' --, other tables
);

OPEN c;

FETCH NEXT FROM c INTO @t;

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @sql = ', ' + name = CASE ISDATE(' + name + ') WHEN 1 THEN 
          DATEADD(HOUR, 5, ' + name + ' ELSE NULL END'
    FROM sys.columns 
    WHERE name LIKE '%date' AND [object_id] = OBJECT_ID(@t);

    SELECT @sql = 'UPDATE ' + @t + ' SET ' + STUFF(@sql, 1, 1, N'');

    PRINT @sql;
    -- EXEC sp_executesql @sql;

    FETCH NEXT FROM c INTO @t;
END

CLOSE c;
DEALLOCATE c;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...