Поиск некорректных дат средствами 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. Долгожитель попался :) 

См. также

Поиск данных Внешние источники данных Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Если вам нужно автоматически генерировать представления (view) к вашей базе данных 1С (есть две версии - для СУБД MS SQL Server и для PostgreSQL) по структуре метаданных 1С, то вам необходима данная обработка. Наш "Генератор View", другими словами - это коннектор к данным 1С для Power BI - незаменимый помощник для бизнес-аналитиков, работающих с базами 1С из Yandex Datalens/Power BI и т.д. Работает для обычных и управляемых форм под 1С 8.3

230000 руб.

31.07.2020    13745    13    48    

25

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

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

10800 руб.

14.05.2012    158964    336    253    

570

Розничная торговля WEB-интеграция Поиск данных Пользователь Платформа 1С v8.3 Оперативный учет 1С:Розница 2 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Альтернатива сервису 1С Номенклатура, не требует подписки ИТС, ищет данные в открытых источниках. Для поиска товара по штрихкоду в сети интернет, полезно для первоначального заполнения базы.

1999 руб.

15.10.2020    18981    23    63    

24

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

Несколько упакованных в один класс интерфейсов для обработки популярных универсальных коллекций. Для тех, кого раздражает отсутствие действительно единого интерфейса для универсальных коллекций.

5 стартмани

25.09.2024    2228    0    Артано    14    

19

Поиск данных Программист Платформа 1С v8.3 Россия Бесплатно (free)

В этой статье я хочу рассмотреть еще один кейс применения Clickhouse в связке с 1С - оптимизацию поиска в справочнике по ключевым словам. Здесь не будет готового решения, но будут описаны важные моменты, которые позволят легко применить данный кейс в реальности.

18.08.2024    1808    1cnik2    23    

14

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

Отображение и просмотр реквизитов справочника или документа - с бесконечным открытием подуровней.

1 стартмани

14.06.2024    3394    7    RustIG    26    

22

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

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

1 стартмани

30.11.2023    4563    andreysidor4uk    18    

53

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

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

1 стартмани

05.06.2023    2327    25    PowerBoy    1    

15
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Филин 370 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 163 04.10.19 11:28 Сейчас в теме
(2) таки да, валится ежели участвует в первичных ключах-индексах
3. Jimbo 10 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 10 04.10.19 15:38 Сейчас в теме
(5) SELECT @WrongData = '2001-01-01 00:00:00'; помогло
8. Jimbo 10 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';
Оставьте свое сообщение