Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.049 c
2-1179232495
NotAva
2007-05-15 16:34
2007.06.03
сообщение на перерисовку


15-1178791060
Руслан
2007-05-10 13:57
2007.06.03
Можно ли включить компьютер с помощью сетевой карты?


3-1173319054
Antoxa2005
2007-03-08 04:57
2007.06.03
Вопросик на зание SQL. (Дамы с праздником 8 марта)


15-1178542088
iXT
2007-05-07 16:48
2007.06.03
мой WinXP заболел :( ???


11-1160962882
Grademax
2006-10-16 05:41
2007.06.03
Как в KOL создать кнопку в стиле XP с картинкой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский