Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Вниз

Товарищи нужен совет!   Найти похожие ветки 

 
Style   (2003-12-08 19:59) [0]

В общем пишу компонент - Direct Access для MSSQL
Дело такое MSSQL возвращает мне дату / время, в виде 8 байтовой строки.
Короче получаю некий

FData: pchar;

Все было бы просто если бы я получал double
тогда
MyDateTime := pdouble(FData)^
так бы я получил точный DateTime

Но там другая структура
Если посмотреть дамп памяти то

HI DWORD это "дата" а LO это Время
т.е. первые 4 байта - "дата", вторые "время"

В общем это некий перевернутый TTimeStamp помоему чем то похожий на UNIXTIME

Так вот если я Создаю TIMESTAMP?

T: TTimeStamp; и присваиваю значения из FData

T.Date = pinteger(FData)^;
T.Time = pinteger(FData+4)^;

то получается не совсем то что хотелось бы..

1)Дата отстает ровно на двое суток! - как я понял это разница нулевого времени Windows и Microsoft SQL Server. Решается увеличением даты на +2;

2) А Время вообще получается несколько бредовое.. Совсем не похоже на реально расположенные данные в таблице :(

Чё делать!???


 
Zz_   (2003-12-08 20:54) [1]

Values with the datetime data type are stored internally by Microsoft SQL Server as two 4-byte integers. The first 4 bytes store the number of days before or after the base date, January 1, 1900. The base date is the system reference date. Values for datetime earlier than January 1, 1753, are not permitted. The other 4 bytes store the time of day represented as the number of milliseconds after midnight.


 
Style   (2003-12-08 21:00) [2]

И как мне этот не буду ругаться матом :) "represented as the number of milliseconds after midnight" в нормальное время преобразовать.??? Блин
ладно утро вечера мудреннее завтра покапаюсь и надеюсь разбiруся!


 
KSergey   (2003-12-09 08:59) [3]

Совет, увы, дать не могу, но из любопытства: а чем он будет лучше существующего? Не, я ничего плохого сказать не хочу, но мне любопытно...


 
Style   (2003-12-09 09:40) [4]

Тем что мы полностью отказываемся от TDataSet и от BDE
в этих компонентах действительно много лишнего..
+ надо переписать гриды и лукапы...

TNMKDA_CustomQueryInterface = class(TObject)
private
FActive: boolean;
FSQL: TStringList;
FQueryResult: TNMKDA_CustomQueryResult;
FConnection: TNMKDA_CustomConnection;

procedure GetResult;
procedure GetColumns;
procedure GetData;

public
property Active: boolean read FActive;
property Connection: TNMKDA_CustomConnection read FConnection write FConnection;
property QueryResult: TNMKDA_CustomQueryResult read FQueryResult;
property SQL: TStringList read FSQL write FSQL;

constructor Create();
destructor Destroy(); override;

procedure Open;
procedure Close;

procedure CheckConnection;
end;

Вот это собственно сам интерфейс работы с квериной..

Дальше я от него унаследуюсь и создам уже TCustomQuery - т.е. запрос с параметрами.

Просто будеть действительно все своё.


 
REA   (2003-12-09 10:50) [5]

А не велосипед ли изобретается? Столько уже методов доступа есть к этому MS SQL.


 
Nikolay M.   (2003-12-09 11:08) [6]

Посмотри исходники ZeosLibrary - там есть компоненты прямого досутпа к МС СКЛ, может чего полезного накопаешь. Только возникает вопрос - а зачем оно вообще надо? Как в анекдоте: мне не надо, чтобы вы вырыли яму, мне надо, чтобы вы задолбались?


> И как мне этот не буду ругаться матом :) "represented as
> the number of milliseconds after midnight" в нормальное
> время преобразовать.???

Легко. Разделить его на количество миллисекунд в сутках, т.е. на (24*60*60*1000) - получится время в дельфевом формате.


 
Style   (2003-12-09 12:13) [7]

Даже если и велосипед -
просто для себя же делаю.

Мне многое не нужно

2Nikolay - я это ужо понял..
Но вот результат все равно не такой :(

Короче вот такие вот данные:

128 203 164 0 - 10:00:00:00
172 204 164 0 - 10:00:01:00
208 17 165 0 - 10:01:00:00
64 70 181 0 - 11:00:00:00

Если просто представляю как integer потом делю на
d:double
d := i / (24*60*60*1000);

Получается совсем не такое время :(

Можеть перевернуть Hi и Lo??


 
Nikolay M.   (2003-12-09 12:28) [8]

значит получается, что
10 часов ровно = (0*65536*256 + 164*65536 + 203*256 + 128) = 10800000
10 часов 1 секунда = (0*65536*256 + 164*65536 + 204*256 + 172) = 10800300
т.е. 1 наша секунда = 300 единицам, приходящим от сервера. Вот и считай.


 
Style   (2003-12-09 12:53) [9]

Все спасибо огромное

d: double;

d := pinteger(fdata)^;
t := pinteger(fdata+4)^;
t := (t / 300)/(24*60*60);
d := d+t+2;

Вот так работает



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
1-99544
Jiurasdg45
2003-12-16 11:45
2003.12.30
Защита программ!!!


14-99714
RainKm
2003-12-09 10:47
2003.12.30
Com


14-99732
Layner
2003-12-08 11:32
2003.12.30
Помогите купить лиц. D7. Контора (сайт) / цена


8-99662
mrAld
2003-08-28 14:33
2003.12.30
Термин


1-99543
ksushishka
2003-12-15 14:23
2003.12.30
Программно менять раскладку клавиатуры с русской на английскую





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский