Binärformat timestamp with time zone

Hallo,

ich habe eine Anwendung bei der Binärdaten mit Zeitstempel (timestamp with time zone) per copy Befehl in die Datenbank eingefügt werden. Nun habe ich festgestellt, dass das Format des Zeitstempels in der Version 8.3.5 und 8.3.7 unterschiedlich ist. Kennt hier jemand genauere Details?

Test:

CREATE TABLE test
(
  ts timestamp with time zone
)
insert into test(ts) values ('22.04.1976 09:15:00'::timestamp with time zone);

Dann auf der Kommandozeile:

psql -U postgres -c "copy test to stdout binary" testdb > c:\temp\data.dat

In 8.3.5:

Byte 00-15: 0x50 0x47 0x43 0x4f 0x50 0x59 0x0d 0x0a 0xff 0x0d 0x0d 0x0a 0x00 0x00 0x00 0x00 
Byte 16-31: 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x08 0xc1 0xc6 0x48 0x50 0x7e 
Byte 32-47: 0x00 0x00 0x00 0xff 0xff

In 8.3.7:

Byte 00-15: 0x50 0x47 0x43 0x4f 0x50 0x59 0x0d 0x0a 0xff 0x0d 0x0d 0x0a 0x00 0x00 0x00 0x00 
Byte 16-31: 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x08 0xff 0xfd 0x57 0xfe 0x23 
Byte 32-47: 0x92 0xc9 0x00 0xff 0xff

Vielen Dank,
Tobias

Puhhh.

Obligatorische Frage: muß das sein?

Okay.

Frage: bist Du Dir sicher, gleiche Rahmenbedingungen zu haben, also gleiches client_encoding, Zeitzone etc.?

Ich weiß nicht, ob das eine Rolle spielt, falls es das nicht ist, weiß ich auch nicht, was da tut.

Andreas

Hallo,

Ja, das habe ich auch gesagt:-)

Den Test habe ich ohne Reboot gleich hintereinander gemacht. Dazu habe ich die eine PG-Version deinstalliert und gleich die neue installiert. Die Config-Files habe ich gelöscht, und jedes Mal die Datenbank mit UTF-8 erzeugt. Der Client war psql und dann per pipe in die Datei.

Wie kann ich die relevanten Rahmenbedingen vor dem Test validieren?

Könnte es sein, dass sich das Format von Double in Float gändert hat? Es werden ja Sekunden seit 1.1.2000 abgespeichert und die FF in der 8.3.7 sehen ganz nach einer negativen Zahl im Zweierkomplement aus, was meinst du?

Gruß,
Tobias

Was mir grad einfällt, ich aber mangels Zeit grad die Doku dazu nicht finde: es gibt da wohl beim compilieren unterschiedliche Möglichkeiten, wie timestamps intern gespeichert werden, also mit welcher Genauigkeit.

Andreas

Hi,

irgendwann im 8.3-Zyklus ist der One-Click-INstaller von EnterpriseDB mit --enable-integer-datetimes(PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Date/Time Types) kompiliert worden.

Das sollte eigentlich nicht passieren, da dass auch dazu führt, das der Cluster einer vorherigen Minor-Version nicht mehr lesbar ist für die neue Version.
Ist mir selbst passiert, da ich auf WIn nur teste , war es nicht so schlimm.

Das pginstaller-projekt ist nicht davon betroffen, soweit ich weiß.

freundliche Grüße
hkocam

Ja, PG kann wahlweise mit --enable-integer-datetimes kompiliert werden, das ändert dann natürlich das Format, wie die Daten intern abgelegt werden.

Hi,

Vielen Dank für eure Antorten. Nun wäre es interessant vom Client aus nachsehen zu können, ob die gerade laufende Version doubles, oder integers für timestamps verwendet. Eine Möglichkeit wäre eine TempTable anzulegen und ein definiertes Datum reinzulegen, um danach nachzusehen, was drin steht. Aber vielleicht gibt es noch eine schönere Möglichkeit?

Danke,
Tobias

SHOW integer_datetimes;

Geradewegs aus meinem Buch kopiert g

Nun, der Befehl geht, das Buchgibts allerdings noch nicht :rolleyes:

Danke.

Gruß,
Tobias

Nein, das stimmt. Und die Anzahl Seiten stimmt auch nicht.
Habe gestern die letzten größeren Sachen eingecheckt.