Paradox データベースのDateTimeを人間のわかる形にもどすには?

解決


non  2008-11-02 23:03:23  No: 101251  IP: 192.*.*.*

はじめまして。
早速ですがParadoxDBで作成された*.DBファイルをvbで書き換えるものを
作ろうと思っていますが、タイトルの件で壁にぶつかりました。

ファイルに保存されたDataTime形式はバイナリになり
C2 CC D0 37 9F E1 00
となります。(これの場合は2008年11月1日12時ちょうど)
このバイナリを元の状態(人間にわかりやすい)に戻せなくて困っています。
どなたか、Paradoxについてご存知の方がいればよろしくお願いします。

編集 削除
non  2008-11-02 23:17:26  No: 101252  IP: 192.*.*.*

すみません。先ほどの書き込みの
バイナリ部分は
CC D0 37 9F E1 00 00
が正しいです。
よろしくお願いします。

編集 削除
オショウ  2008-11-03 07:45:40  No: 101253  IP: 192.*.*.*

ここの過去ログ検索したら・・・
http://madia.world.coocan.jp/vb/vb_bbs/200308/200308_03080056.html
参考になると思いますが。

以上。

編集 削除
non  2008-11-03 11:13:26  No: 101254  IP: 192.*.*.*

オショウさんありがとうございます。

私も過去ログは拝見しましたがDBに接続して
書き換えではなく、ローカルでファイルを直接
書き換えしたいのでちょっと異なるかと・・・
すみません。引き続きおねがいします。

編集 削除
オショウ  2008-11-04 07:39:28  No: 101255  IP: 192.*.*.*

何故、直接読み書きしたいのでしょう?
基本、DBはアクセスさせる為の手法が指定されています。
フォーマットが公開されていないのは一般的なので、頑張って
もどうにもならない場合が非常に多いかと。

因みに、内部解析したら違法行為と取られる場合が一般的です。

よって、そういう行為はお止めになった方が得策かと。

以上。

編集 削除
やじゅ  2008-11-04 13:24:06  No: 101256  IP: 192.*.*.*

Paradoxの日付が当てはまるか分かりませんが、
1970年1月1日 00:00:00を基準としたミリ秒単位の日付としてるなら
指定日時から差し引いて、16進数化するといいかも知れません。
http://architect360.apricot-jp.com/500tips/datetime.html

編集 削除
かん  2008-11-04 19:39:45  No: 101257  IP: 192.*.*.*

http://www.thedbcommunity.com/index.php?option=com_content&task=view&id=33&Itemid=56
西暦0001年1月1日からのmsを浮動小数点(8バイト)で保持しているみたいです。

// 確認してみました
,以降はms(ミリセコンド)
2008/11/02 12:00:00.000 //C2 CC D0 3A 33 0F 00 00 // -63361310400,000 -A
2008/11/01 12:00:00.000 //C2 CC D0 37 9F E1 00 00 // -63361224000,000 -B

マイナスになっているので+に(何故かは不明)
(A - B)/1000(ms) = 86400(S)
86400 / 60(S) = 1440(M)
1440 / 60(M) = 24(h)

でいけそうですが、変換部分のVBでの実装方法が分かりません。
日付計算については
1970/01/01 00:00:00の数値をあらかじめ計算して、引き算してから
>やじゅ 2008/11/04(火) 13:24:06 さんの方法で試してみてください。

union {
 double x;
 char c[8];
} a;

a.c[0] = 0x00;
a.c[1] = 0x00;
a.c[2] = 0xe1;
a.c[3] = 0x9f;
a.c[4] = 0x37;
a.c[5] = 0xd0;
a.c[6] = 0xcc;
a.c[7] = 0xc2;

TRACE("%lf\n",a.x);

-63361224000000

編集 削除
mossa  2008-11-04 21:42:55  No: 101258  IP: 192.*.*.*

みなさまありがとうございます。
オショウさんの言われるとおりかもしれませんが、
ある業務用アプリ(特注)がParadoxのデータベースファイルを
使用したアプリになってまして、制作した会社が倒産してサポートを
受けられずしかたなく「自分たちで作ろう」という運びになりました。

ただ、Paradoxが動いているのではなく単にファイル形式として
使用されているだけなので今回のような質問にいたったわけです(^^;


やじゅさん、かんさんありがとうございます。
msというのはなんとなく気づきましたが、8バイトというのは気づきませんでした。
元のファイルには7バイトまでのバイナリしかありません。推測ですが、
秒単位の精度で問題ないためファイルに書き出さず内部で処理していたのかも
しれません。

皆様ありがとうございました。

編集 削除
かん  2008-11-04 22:29:40  No: 101259  IP: 192.*.*.*

せめて変換方法位は・・

Declare Sub CopyValtoVal Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal length As Long)


Dim byt(8) As Byte
Dim dbl As Double

byt(0) = &H0
byt(1) = &H0
byt(2) = &HE1
byt(3) = &H9F
byt(4) = &H37
byt(5) = &HD0
byt(6) = &HCC
byt(7) = &HC2

CopyValtoVal dbl, byt(0), 8
Debug.Print dbl

ここの過去ログ凄いですね。

編集 削除
かん  2008-11-05 00:13:18  No: 101260  IP: 192.*.*.*

追記
先頭ビットでA.CとB.Cみたいです。
気がつかなかった。

編集 削除