Обсуждение: Inserting timestamp values from windowz application

Поиск
Список
Период
Сортировка

Inserting timestamp values from windowz application

От
"cnliou"
Дата:
Hi!

I am inserting timestamp values from C++Builder project1.exe 
compiled with ZEOSLIB on Win98 (set to time zone UTC+8 
hours) into the table:

CREATE TABLE (c1 TIMESTAMP WITH TIME ZONE);

After project1.exe connects to postgres via libpq.dll, the 
query

SHOW TIME ZONE

returns "unknown", which is as expected. Then I do the 
insert from project1.exe:

INSERT INTO test VALUES (CAST('2003-1-1' AS TIMESTAMP));

What weird is that this datetime value is saved to column c1 
as 2002-12-31 16:00:00 UTC. This means that some component 
among zeoslib, libpq, win98, or postgres is _too_ smart that 
it assumes the to-insert value being local time at time zone 
UTC+08 and converts the value to UTC.

This automatic behavior is not what I would like to see. I 
guess zeoslib is unlikely to be the component that does the 
conversion. How does this smart component know that the 
to-insert value stands for the local time at UTC+08 time 
zone?

I need a "manual" way to explicitly tell postgres the 
client's time zone by sending from project1.exe the query  
"SET TIME ZONE -5" or the like to postgres.

Would anyone kindly offer some solutions to my requirement 
or explanations for the symptom?

Regards,

CN


Re: Inserting timestamp values from windowz application

От
Tom Lane
Дата:
"cnliou" <cnliou@so-net.net.tw> writes:
> After project1.exe connects to postgres via libpq.dll, the 
> query
> SHOW TIME ZONE
> returns "unknown", which is as expected. Then I do the 
> insert from project1.exe:
> INSERT INTO test VALUES (CAST('2003-1-1' AS TIMESTAMP));
> What weird is that this datetime value is saved to column c1 
> as 2002-12-31 16:00:00 UTC.

This means that your system default timezone is UTC+8.

The fact that SHOW TIME ZONE returns "unknown" does not mean that your
time zone setting is UTC.  It means that the standard C library
interface doesn't provide any way to find out the setting in string
form :-(.  SHOW TIME ZONE can tell you something useful if either
(1) you've done a SET TIME ZONE, or (2) the variable TZ is
defined in the postmaster's environment.  Otherwise it says "unknown"
... but the C library nonetheless will find a time zone setting from
someplace.

> I need a "manual" way to explicitly tell postgres the 
> client's time zone by sending from project1.exe the query  
> "SET TIME ZONE -5" or the like to postgres.

What's so hard about that?
        regards, tom lane