Поиск некорректных дат средствами SQL

03.10.19

Задачи пользователя - Поиск данных

Ошибка "Дата ' **.**.**** ' не может быть записана в базу данных на MS SQL Server с нулевым смещением дат.

Собственно описание проблемы:

 Обратился ко мне мой старый товарищ, с просьбой посодействовать в поиске одной ошибке, которая у него возникала при создании распределенной базы данных. Текст ошибки приблизительно такой:

Дата '01.01.0001 00:00:00' не может быть записана в базу данных на MS SQL Server с нулевым смещением дат.

Задача стояла в следующем, чтоб пройтись по всем таблицам базы и найти, где накосячили доблестные работницы финансовой службы. 

 

Решение:

1. Выполняем на SQL следующий код:

SET NOCOUNT ON;  
DECLARE @tablename varchar(255);  
DECLARE @sql_str varchar(1000);
DECLARE @WrongData varchar(15);
DECLARE @CountRec Int;
  
DECLARE tables CURSOR FOR  
   SELECT TABLE_SCHEMA + '.' + TABLE_NAME  
   FROM INFORMATION_SCHEMA.TABLES  
   WHERE TABLE_TYPE = 'BASE TABLE';  
  
OPEN tables;  
  

-- кривая дата
SELECT @WrongData = '01.01.0001 00:00:00';

FETCH NEXT  
   FROM tables  
   INTO @tablename;  
  
WHILE @@FETCH_STATUS = 0  
BEGIN  


    ----  проверка на дату в документах  и журналах
    IF col_length(N''+@tablename,'_Date_Time') is not null 

        BEGIN
            SELECT @sql_str = 'SELECT * INTO _ResWrongDate FROM ' + @tablename + ' WHERE _Date_Time<'+''''+@WrongData+''''+'';
            EXEC(@sql_str)
            
            SELECT @CountRec = (SELECT COUNT(*) FROM _ResWrongDate); 
            
            IF @CountRec > 0 
            BEGIN    
                PRINT('Неккоректная дата в таблице '+@tablename+' . записей '+ LTrim(Str(@CountRec)));
            END

            DROP TABLE _ResWrongDate;
        END;

    -- в регистрах
    IF col_length(N''+@tablename,'_Period') is not null 

        BEGIN
            SELECT @sql_str = 'SELECT * INTO _ResWrongDate FROM ' + @tablename + ' WHERE _Period<'+''''+@WrongData+''''+'';
            EXEC(@sql_str)
            
            SELECT @CountRec = (SELECT COUNT(*) FROM _ResWrongDate); 
            
            IF @CountRec > 0 
            BEGIN    
                PRINT('Неккоректная дата в регистре '+@tablename+' . записей '+ LTrim(Str(@CountRec)));
            END

            DROP TABLE _ResWrongDate;
        END;

   FETCH NEXT  
      FROM tables  
      INTO @tablename;  
END;  
  
 
CLOSE tables;  
DEALLOCATE tables;  
  
GO  

 

Получаем все названия таблиц в которых присутствует некорректная дата.

Либо обработкой, либо сами с помощью команды ПолучитьСтруктуруХраненияБазыДанных находим, что это за документ или регистр. 

Находим этот объект, исправляем корректную дату. 

В нашем случае дата выдачи паспорта человеку была аж 01.01.0001. Долгожитель попался :) 

См. также

Быстрый поиск дублей с четким/нечетким поиском по любому сочетанию реквизитов/реквизитов таб. частей с отбором и быстрой заменой значений в ЛЮБЫХ базах 8.1-8.3 (УТ 10.3, БП 2, ЗУП 2.5, КА 1.1, УТ 11, БП 3, УНФ 1.6/3.0, КА 2, ЗУП 3 и т.д.)

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

9600 руб.

14.05.2012    155289    326    252    

558

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

Архивирование (backup) Журнал регистрации Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

19200 руб.

15.05.2017    42521    10    24    

38

Кто такая Мантикора?

Поиск данных Платформа 1С v8.3 Россия Абонемент ($m)

Статья об опыте развертывания и интеграции с базой данных Manticore Search для быстрого полнотекстового поиска.

1 стартмани

30.11.2023    3058    andreysidor4uk    16    

45

PowerOffice

Поиск данных Корректировка данных Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

PowerOffice - обработка для поиска, просмотра и обработки данных для пользователей. Доступ к объектам на просмотр и редактирование данных определяется правами пользователя.

1 стартмани

05.06.2023    1922    23    PowerBoy    1    

15

Получение ссылки по бинарной строке PostgreSQL или MSSQL

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Получение ссылки в 1С по бинарной строке из PostgreSQL в виде строки формата bytea или из MSSQL в виде шестнадцатиричной строки. Кроме ссылочных объектов ссылки могут быть получены и для перечислений. Это может быть полезно при анализе логов журнала регистрации или СУБД.

1 стартмани

04.04.2023    2581    2    berserg    2    

12

Поиск документов с ошибками проведения, универсальный

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Обработка позволяет найти проведенные документы без движений и, наоборот, НЕ проведенные документы с движениями. Подходит для любой конфигурации.

1 стартмани

18.08.2022    2986    21    KVIKS    3    

10

Поиск и замена значений + Поиск дублирующихся элементов справочников с подключением к внешней базе

Поиск данных Корректировка данных Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для гибкого поиска и дальнейшей замены дублей справочников, документов, а также планов видов расчетов и планов видов характеристик. В обработку включена возможность проверки наличия ссылки во внешней базе (по УИДу), поиска дублей с предварительным отбором, а также произвольной обработки реквизитов перед поиском (например, возможно удалить определенные символы из наименования).

3600 руб.

30.03.2022    8586    3    0    

5
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Филин 362 03.10.19 17:14 Сейчас в теме
А если проблемная дата будет не в "Периоде", а где-то еще? Лучше уж все колонки соответствующего типа проверить.

declare @table nvarchar(128),
	@obj_id int,
	@cmd nvarchar(max),
	@condition nvarchar(max)


declare tbls cursor for
select name, object_id
from sys.tables 

open tbls
while 1=1
begin
	fetch next from tbls into @table, @obj_id
	if @@FETCH_STATUS != 0
		break

	set @condition = N''
	select @condition = @condition  + '( '+c.name+' = ''00010101 00:00:00'' ) or'
	from sys.columns c
		inner join sys.types t
			on c.user_type_id = t.user_type_id
	where c.object_id = @obj_id
		and 	t.name in ( 'datetime2') --'datetime'

	if (len( @condition) = 0 ) or (@condition is null)
		continue

	set @condition = left (@condition, len(@condition) - 2)  --уберем последний OR

	set @cmd = 'if exists (select top 1 1 from '+@table+ N' where ' +@condition + N') 
			print ('' '+@table+N''')'

	exec (@cmd)
end
close tbls
deallocate tbls


Показать
2. sutygin 36 04.10.19 09:34 Сейчас в теме
Ну задачи колонки проверить небыло. К тому же явно выгрузка валится не из за реквизитов документов, а из за выгрузки движений регистра.
4. Fox-trot 156 04.10.19 11:28 Сейчас в теме
(2) таки да, валится ежели участвует в первичных ключах-индексах
3. Jimbo 9 04.10.19 11:22 Сейчас в теме
SQL2008R2 EngStd на типовых БП 3 и не типовой УПП:

Msg 242, Level 16, State 3, Line 1
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.
5. sutygin 36 04.10.19 15:00 Сейчас в теме
SELECT @WrongData = '01.01.0001 00:00:00';
Вот в этой строке у вас не корректное значение.
Скорее у вас смещение дат
Поставьте SELECT @WrongData = '01.01.2001 00:00:00';
7. Jimbo 9 04.10.19 15:38 Сейчас в теме
(5) SELECT @WrongData = '2001-01-01 00:00:00'; помогло
8. Jimbo 9 04.10.19 15:40 Сейчас в теме
(7) ну и DECLARE @WrongData varchar(19); а не 15
6. sutygin 36 04.10.19 15:08 Сейчас в теме
И да, если база со смещением дат, то к дате надо прибавлять 2000.
И проверять на некорректные значения лучше с даты к примеру '01.01.3919 00:00:00';
Оставьте свое сообщение