Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
ВнизSQL Query Analyzer vs ADO: различия в интерпритации даты Найти похожие ветки
← →
Kostafey © (2007-05-13 19:43) [0]Уважаемые Мастера! Прошу помочь в решении следующей проблемы.
Необходимо переместить данные БД (MS SQL Server 2000) добавленные
раньше чем год назад из одних таблиц в другие (идентичные по структуре):procedure TForm_DumpARX.Dump_toARX;
var
DumpToDate: TDate;
Recordset: _Recordset;
RecAff: Integer;
RecAff2: OleVariant;
begin
...
DumpToDate := Now;
DumpToDate := DumpToDate - 365;
mout("В архив сбрасываются данные введенные до " + DateToStr(DumpToDate)); //Убеждаемся: 13.05.2006
... //mout - это Memo1.Lines.add
ADOCommand1.CommandText :=
"Declare @DateTo datetime "#13#10 +
"Set @DateTo = :DateTo "#13#10 +
" "#13#10 +
"Begin Transaction "#13#10 +
"-----------------------------------------------------------------"#13#10 +
" "#13#10 +
"insert into zvkrtpARX "#13#10 +
"select zvkrtp.* from zvkrtp "#13#10 +
" Join ZVK1 "#13#10 +
" on(zvkrtp.nzvk = ZVK1.N_ZVK and ZVK1.DATE_ZVK < @DateTo) "#13#10 +
" "#13#10 +
"delete from zvkrtp "#13#10 +
"where zvkrtp.nzvk in "#13#10 +
"( "#13#10 +
" select zvkrtp.nzvk "#13#10 +
" from zvkrtp "#13#10 +
" Join ZVK1 "#13#10 +
" on (zvkrtp.nzvk = ZVK1.N_ZVK) and (ZVK1.DATE_ZVK < @DateTo) "#13#10 +
") "#13#10 +
" "#13#10 +
"-----------------------------------------------------------------"#13#10 +
...
"Commit Transaction ";
ADOCommand1.Parameters.ParamByName("DateTo").Value := DumpToDate;
Recordset := ADOCommand1.Execute(RecAff, EmptyParam);
mout("zvkrtpARX: "#9 + IntToStr(RecAff) + " записей скопировано в архив ");
Recordset := Recordset.NextRecordset(RecAff2);
mout("zvkrtp: "#9 + IntToStr(RecAff2) + " записей удалено ");
...
Смотрим результат:
zvkrtpARX: 352 записей скопировано в архив
zvkrtp: 352 записей удалено
ZVK3ARX: 556 записей скопировано в архив
ZVK3: 556 записей удалено
ZVK4ARX: 346 записей скопировано в архив
ZVK4: 346 записей удалено
ZVK41ARX: 441 записей скопировано в архив
ZVK41: 441 записей удалено
ZVK_TEXARX: 0 записей скопировано в архив
ZVK_TEX: 0 записей удалено
ZVK1ARX: 347 записей скопировано в архив
ZVK1: 347 записей удалено
frcrtpARX: 54 записей скопировано в архив
frcrtp: 54 записей удалено
FRC3ARX: 83 записей скопировано в архив
FRC3: 83 записей удалено
FRC4ARX: 50 записей скопировано в архив
FRC4: 50 записей удалено
FRC41ARX: 66 записей скопировано в архив
FRC41: 66 записей удалено
FRC1ARX: 50 записей скопировано в архив
FRC1: 50 записей удалено
Теперь пробую тот же самый запрос в SQL Query Analyzer:Declare @DateTo datetime
Set @DateTo = "2006.05.13"
Begin Transaction
-----------------------------------------------------------------
insert into zvkrtpARX
select zvkrtp.* from zvkrtp
Join ZVK1
on(zvkrtp.nzvk = ZVK1.N_ZVK and ZVK1.DATE_ZVK < @DateTo)
delete from zvkrtp
where zvkrtp.nzvk in
(
select zvkrtp.nzvk
from zvkrtp
Join ZVK1
on (zvkrtp.nzvk = ZVK1.N_ZVK) and (ZVK1.DATE_ZVK < @DateTo)
)
-----------------------------------------------------------------
...
Commit Transaction
Результат:
(339 row(s) affected)
(339 row(s) affected)
(532 row(s) affected)
(532 row(s) affected)
(333 row(s) affected)
(333 row(s) affected)
(423 row(s) affected)
(423 row(s) affected)
(0 row(s) affected)
(0 row(s) affected)
(334 row(s) affected)
(334 row(s) affected)
(53 row(s) affected)
(53 row(s) affected)
(81 row(s) affected)
(81 row(s) affected)
(49 row(s) affected)
(49 row(s) affected)
(65 row(s) affected)
(65 row(s) affected)
(49 row(s) affected)
(49 row(s) affected)
Как видите, результат отличается от ожидаемого.
← →
Kostafey © (2007-05-13 19:47) [1]Пробую то же самое для ряда дат. Первый столбец слева - результат работы программы приводится
для сравнения, далее результата рыботы SQL Query Analyzer (перед каждым запуском выполняется
полный бэкап БД):
ADO:13.05.06 Set @DateTo = "2006.05.13" "2006.05.14" "2006.05.15" "2006.05.16" "2006.05.17"
352 339 347 348 352 364
352 339 347 348 352 364
556 532 545 550 556 568
556 532 545 550 556 568
346 333 341 342 346 358
346 333 341 342 346 358
441 423 434 437 441 454
441 423 434 437 441 454
0 0 0 0 0 0
0 0 0 0 0 0
347 334 342 343 347 359
347 334 342 343 347 359
54 53 54 54 54 54
54 53 54 54 54 54
83 81 83 83 83 83
83 81 83 83 83 83
50 49 50 50 50 50
50 49 50 50 50 50
66 65 66 66 66 66
66 65 66 66 66 66
50 49 50 50 50 50
50 49 50 50 50 50
← →
Kostafey © (2007-05-13 19:50) [2]Как видите, совпадение результатов только при Set @DateTo = "2006.05.16".
Но почему так происходит ? Ведь у меня в ОС стоит дата 13.05.2007, а результат
выражения
DumpToDate := Now;
DumpToDate := DumpToDate - 365;
mout("В архив сбрасываются данные введенные до " + DateToStr(DumpToDate));
возвращает 13.05.2006. Почему же тогда такой разрыв в 3 дня получается ?
← →
Kostafey © (2007-05-13 19:52) [3]В > [1] Kostafey © (13.05.07 19:47)
столбцы сместились.
Последний относится к "2006.05.17, предпоследний к "2006.05.16"
← →
sniknik © (2007-05-13 20:05) [4]> DumpToDate := Now;
> DumpToDate := DumpToDate - 365;
поменяй это на DumpToDate := Date() - 365; иначе фигня какаято получается...
и вот это
> Set @DateTo = "2006.05.13"
на Set @DateTo = "20060513", просто так.
← →
Kostafey © (2007-05-13 20:15) [5]> поменяй это на DumpToDate := Date() - 365;
Поменял:
348
348
550
550
342
342
437
437
0
0
343
343
54
54
83
83
50
50
66
66
50
50
> на Set @DateTo = "20060513",
Поменял:
(339 row(s) affected)
(339 row(s) affected)
(532 row(s) affected)
(532 row(s) affected)
(333 row(s) affected)
(333 row(s) affected)
(423 row(s) affected)
(423 row(s) affected)
(0 row(s) affected)
(0 row(s) affected)
(334 row(s) affected)
(334 row(s) affected)
(53 row(s) affected)
(53 row(s) affected)
(81 row(s) affected)
(81 row(s) affected)
(49 row(s) affected)
(49 row(s) affected)
(65 row(s) affected)
(65 row(s) affected)
(49 row(s) affected)
(49 row(s) affected)
← →
Kostafey © (2007-05-13 20:16) [6]О ! Уже ближе !
результат работы программы теперь идентичен Set @DateTo = "2006.05.14"
← →
Kostafey © (2007-05-13 20:18) [7]> идентичен Set @DateTo = "2006.05.14"
соврал Set @DateTo = "2006.05.15"
← →
sniknik © (2007-05-13 20:25) [8]> О ! Уже ближе !
не уверен, но поменяй еще
> DumpToDate: TDate;
на DumpToDate: TDateTime;
← →
Anatoly Podgoretsky © (2007-05-13 20:28) [9]> sniknik (13.05.2007 20:25:08) [8]
Это без разницы.
← →
Kostafey © (2007-05-13 20:34) [10]> не уверен, но поменяй еще
> > DumpToDate: TDate;
> на DumpToDate: TDateTime;
Результат работы программы:
339
339
532
532
333
333
423
423
0
0
334
334
53
53
81
81
49
49
65
65
49
49
Yahoooo !!!! 100% совпало с Set @DateTo = "2006.05.13".
Спасибо !
А Вы не подскажете почему так получилось?
← →
sniknik © (2007-05-13 21:43) [11]> Это без разницы.
потому и был не уверен... но как видно не совсем без разницы.
> А Вы не подскажете почему так получилось?
не подскажу... потому как > Set @DateTo = "2006.05.13". и это после [4]...
шутка. но лучше все одно поменяй и пользуйся в MSSQL только такой строкой представления даты, а то может в какойто момент стать "мучительно больно"...
первое исправление убрало время из переменной, поэтому результат стал точнее.
второе дало переменной явный тип а значит и параметру (т.к. он до этого не был определен), и приведение значения стало производится по этому типу, ну а т.к. разница между "началом времен" в дельфях и mssql в 2 дня, то передача неопределенного типа (или необработанного, неохота копаться в недрах генофонда) передавала число в "чистом" виде которое конвертировалась для сравнения с датой уже mssql-ем... соответственно с разницей на 2 дня (в соответствии со своей точкой отсчета).
← →
Kostafey © (2007-05-13 22:14) [12]> не подскажу... потому как > Set @DateTo = "2006.05.13".
> и это после [4]...
> шутка. но лучше все одно поменяй и пользуйся в MSSQL только
> такой строкой представления даты, а то может в какойто момент
> стать "мучительно больно"...
Да, я так на самом деле и сделал.
Просто при ответе [10] торопился поделиться чудом ;)
А это свыше 10 часов эксперименов, каждый из которых требовал
предварительно полного бэкапа, ведь были и другие ошибки.
Спасибо Вам sniknik !
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.055 c