Dostęp w Delphi7 do pola typu DateTime w mssql

0

Szanowni Państwo,

Mam w bazie MSSQL tabelę w której ma pole typu datetime. Jak odczytuję ją w Delhi7:
ADOQuery1.FieldByName('DataZakupu').AsString jest wszystko w porządku (aczkolwiek nie mogę do niej nic dodawać ani odejmować)
ale jak odczytam ją:
ADOQuery1.FieldByName('DataZakupu').AsFloat jest już gorzej. Otrzymuję liczbę np dla daty 2011.02.08 -> 40582

Jeśli zaś tę datę odczytam w MSSQL konwertując ja na liczbę:
'select cast(DataZakupu as int) frpm ...'

otrzymam liczbę 40580

czyli 2 dni wcześniejszą

czy wiecie może dlaczego tak jest i co z tym zrobić?

pozdrawiam

marcin

1
MarcinJankowski napisał(a)

Otrzymuję liczbę np dla daty 2011.02.08 -> 40582

no i to jest poprawna wartość. Data w delphi jest liczona od 30.12.1899 natomiast w mssqlu od 01.01.1900 - tu masz dwa dni różnicy.
Data to jest data a nie string i powinieneś się właśnie jak do daty odnosić. Oznacza to, że zarówno odczytywać jak i zapisywać powinieneś ją jako DateTime a jedynie zmieniać na ciąg zrozumiały dla usera w celu wyświetlenia. Zauważ, że nawet DateTimePicker (i podobne) posługują się typem TDateTime do ustawiania/zwracania daty a jedynie na ekranie widzisz 2011.02.08. Przechowując i odwołując się do daty jako TDateTime unikniesz jeszcze jednej niedogodności - na typ ten nie ma wpływu lokalny format date.

ShowMessage(FormatDate('yyyy-mm-dd', ADOQuery1.FieldByName('DataZakupu').AsDateTime));
ShowMessage(DateToStr(ADOQuery1.FieldByName('DataZakupu').AsDateTime))
ADOQuery1.FieldByName('DataZakupu').AsDateTime := StrToDate('2011.02.10');
0

Dziękuję bardzo.

0

Czy ta baza nie ma pola typu TimeStamp? Chyba nie da się zrobić indeksu na polu bazy danych typu DateTime i przez to sortowanie może być utrudnione.

1 użytkowników online, w tym zalogowanych: 0, gości: 1