Обсуждение: convert in GMT time zone without summer time

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

convert in GMT time zone without summer time

От
LaraK
Дата:
Hello,

I want write a function that converts a timestamp with time zone to the UTC
zone. But it should all be stored in the winter time.

For example, it must now, in the summer, the German time back by 2 hours and
in the winter time only 1 hour. But it expects only back one hour.

Is there a function or a specific time zone?
(I work with PostgreSQL 8.4.7)

[CODE]
CREATE OR REPLACE FUNCTION CONVERT_TO_UTC (TIMESTAMP with time zone,
VARCHAR)
returns TIMESTAMP
as $$
declare v_zone VARCHAR(20); p_time ALIAS FOR $1; p_zone ALIAS FOR $2; v_time1 TIMESTAMP with time zone; v_time2
TIMESTAMPwith time zone; v_text1 text; 
begin IF LENGTH(p_zone) IS NULL THEN   v_zone := 'GMT'; else   v_zone := p_zone; END IF; -- ++ Timestamp with time zone
inText umwandeln select to_char(p_time, 'DD Mon YYYY HH24:MI:SS') into v_text1; if(v_zone in ('BST', 'CET', 'DNT',
'FST','MET', 'MEWT', 'MEZ', 'NOR', 
'SET', 'SWT', 'WETDST')) then   -- ++ Timestamp with time zone in die Zeitzone '+01' umwandeln. ++   SET TIME ZONE 1;
SelectCONVERT_TO_UTC_EXEC(v_text1, 'UTC') into v_time1; elsif(v_zone in ('JST', 'KST', 'MHT', 'WDT', 'AWSST')) then
SETTIME ZONE 9;   -- ++ Timestamp with time zone in die Zeitzone '+09' umwandeln. ++ Select
CONVERT_TO_UTC_EXEC(v_text1,'UTC') into v_time1;   elsif(v_zone in ('GMT', 'UT', 'UTC', 'Z', 'ZULU', 'WET')) then   --
++Zone wird nicht geändert ++   v_time1 := p_time; else   raise exception 'unbekannte Zone - ist noch eine Baustelle';
endif; RETURN v_time1 ; 
end
$$
LANGUAGE 'plpgsql';
[/CODE]
[CODE]
CREATE OR REPLACE FUNCTION CONVERT_TO_UTC_EXEC (Text, Text)
returns TIMESTAMP
as $$
declare p_time ALIAS FOR $1; p_zone ALIAS FOR $2; v_time1 TIMESTAMP with time zone; v_time2 TIMESTAMP with time zone;
v_text1text; 
begin select to_timestamp (p_time, 'DD Mon YYYY HH24:MI:SS') into v_time1 ; -- ++ Timestamp with time zone in die UTC
Zeitzoneumwandeln. ++ Select timezone( p_zone, v_time1) INTO v_time2 ; -- ++ Zeitausgabe formatieren: HH12. ++ v_text1
:=to_char(v_time2, 'DD Mon YYYY HH12:MI:SS AM'); -- ++ In Type Timestamp umwandeln. ++ RETURN to_timestamp( v_text1,
'DDMon YYYY HH12:MI:SS AM') ; 
end
$$
LANGUAGE 'plpgsql';
[/CODE]

calling:
[CODE]
SELECT
to_char(CONVERT_TO_UTC(to_timestamp('2011-03-22 14:17:00', 'YYYY-MM-DD
hh24:MI:SS'), 'CET'), 'yyyy-mm-dd hh24:MI:SS') AS winter,
to_char(CONVERT_TO_UTC(to_timestamp('2011-04-22 14:17:00', 'YYYY-MM-DD
hh24:MI:SS'), 'CET'), 'yyyy-mm-dd hh24:MI:SS') AS summer
[/CODE]

must come out:
[CODE]
WINTER                | SUMMER
--------------------+-------------------------
2011-03-22 13:17:00 | 2011-04-22 12:17:00
[/CODE]

--
View this message in context:
http://postgresql.1045698.n5.nabble.com/convert-in-GMT-time-zone-without-summer-time-tp4304830p4304830.html
Sent from the PostgreSQL - sql mailing list archive at Nabble.com.


Re: convert in GMT time zone without summer time

От
Jasen Betts
Дата:
On 2011-04-15, LaraK <indarija@gmx.net> wrote:
> Hello,
>
> I want write a function that converts a timestamp with time zone to the UTC
> zone. But it should all be stored in the winter time.
>
> For example, it must now, in the summer, the German time back by 2 hours and
> in the winter time only 1 hour. But it expects only back one hour.
>
> Is there a function or a specific time zone?

if I undestand your goal correctly you want to subtract the daylight
savings offset from the given timezone if daylight-savings is in use
in the current time locale.

you can detect daylight-savings by setting testing the timezone offset
at 3 month intervals ( timestamp, timestamp+3months timestamp-3months,
timestamp+6months, timestamp-6months)

the one(s) of them with the least (most negative) offset from UTC will
represent non daylight-saving time.

if your given time has a different offset it's daylight saving time,
add the difference.
calling:
> [CODE]
> SELECT                                    
> to_char(CONVERT_TO_UTC(to_timestamp('2011-03-22 14:17:00', 'YYYY-MM-DD
> hh24:MI:SS'), 'CET'), 'yyyy-mm-dd hh24:MI:SS') AS winter,
> to_char(CONVERT_TO_UTC(to_timestamp('2011-04-22 14:17:00', 'YYYY-MM-DD
> hh24:MI:SS'), 'CET'), 'yyyy-mm-dd hh24:MI:SS') AS summer
> [/CODE]
>
> must come out:
> [CODE]
> WINTER                | SUMMER
> --------------------+-------------------------
> 2011-03-22 13:17:00 | 2011-04-22 12:17:00
> [/CODE]

that test case is ambiguous your inputs are timespamptz but 
have an unspecified timezone (and so get the zone appropriate to 
your time locale). I'm assuming your time locale is "Europe/Berlin" 
and you really mean the following:

SELECT to_char(CONVERT_TO_UTC( '2011-03-22 14:17:00+01'::timestamptz
,'CET'),'yyyy-mm-dd hh24:MI:SS') AS winter, to_char(CONVERT_TO_UTC(
'2011-04-22 14:17:00+02'::timestamptz ,'CET'),'yyyy-mm-dd hh24:MI:SS')
AS summer;

CREATE OR REPLACE FUNCTION  CONVERT_TO_UTC ( timestamptz,  text) returns timestamp as  $$ SELECT $1 at time zone 'UTC';
$$ language sql;
 
In that this function does not use the second parameter it may not be
what you want, on the other hand it's function matches it's name well.
what are you trying to do?

-- 
⚂⚃ 100% natural



Re: convert in GMT time zone without summer time

От
LaraK
Дата:
I find it difficult to understand you.

But the input I can not change:
>SELECT 
>to_char(CONVERT_TO_UTC( '2011-03-22 14:17:00+01'::timestamptz
,'CET'),'yyyy-mm-dd hh12:MI:SS') AS winter, 
>to_char(CONVERT_TO_UTC( '2011-04-22 14:17:00+02'::timestamptz
,'CET'),'yyyy-mm-dd hh24:MI:SS') AS summer; 

The system must know alone when is summertime and when is wintertime. Can it
this?

--
View this message in context:
http://postgresql.1045698.n5.nabble.com/convert-in-GMT-time-zone-without-summer-time-tp4304830p4310095.html
Sent from the PostgreSQL - sql mailing list archive at Nabble.com.


Re: convert in GMT time zone without summer time

От
Steve Crawford
Дата:
On 04/16/2011 05:02 AM, Jasen Betts wrote:
> On 2011-04-15, LaraK<indarija@gmx.net>  wrote:
>> Hello,
>>
>> I want write a function that converts a timestamp with time zone to the UTC
>> zone. But it should all be stored in the winter time.
Done! All timestamp with time zone information is stored internally in UTC.

But you need to be sure you really understand date/time manipulation in 
PostgreSQL so you don't reinvent the wheel.
[CODE]
>> SELECT
>> to_char(CONVERT_TO_UTC(to_timestamp('2011-03-22 14:17:00', 'YYYY-MM-DD
>> hh24:MI:SS'), 'CET'), 'yyyy-mm-dd hh24:MI:SS') AS winter,
>> to_char(CONVERT_TO_UTC(to_timestamp('2011-04-22 14:17:00', 'YYYY-MM-DD
>> hh24:MI:SS'), 'CET'), 'yyyy-mm-dd hh24:MI:SS') AS summer
>> [/CODE]
>>
>> must come out:
>> [CODE]
>> WINTER                | SUMMER
>> --------------------+-------------------------
>> 2011-03-22 13:17:00 | 2011-04-22 12:17:00
>> [/CODE]
> that test case is ambiguous your inputs are timespamptz but
> have an unspecified timezone (and so get the zone appropriate to
> your time locale). I'm assuming your time locale is "Europe/Berlin"
> and you really mean the following:
>
> SELECT to_char(CONVERT_TO_UTC( '2011-03-22 14:17:00+01'::timestamptz
> ,'CET'),'yyyy-mm-dd hh24:MI:SS') AS winter, to_char(CONVERT_TO_UTC(
> '2011-04-22 14:17:00+02'::timestamptz ,'CET'),'yyyy-mm-dd hh24:MI:SS')
> AS summer;

If you can use the correct time zone name, everything is done for you. 
Better yet, it will keep working when the timezone rules change (if you 
apply your patches regularly) or for other time zones:

steve=> select '2011-03-22 14:17:00  Europe/Berlin' at time zone 'UTC';      timezone
--------------------- 2011-03-22 13:17:00
(1 row)

steve=> select '2011-04-22 14:17:00  Europe/Berlin' at time zone 'UTC';      timezone
--------------------- 2011-04-22 12:17:00

Cheers,
Steve



Re: convert in GMT time zone without summer time

От
LaraK
Дата:
Very good!

Another question:
I want to convert the string to the type TIMESTAMP WITH TIME ZONE. What do I
have to format? 'TZ' does not.

select to_timestamp('2011-03-22 14:17:00  Europe/Berlin', 'YYYY-MM-DD
HH:MI:SS  TZ')
---
FEHLER:  Formatmuster »TZ«/»tz« werden in to_date nicht unterstützt

--
View this message in context:
http://postgresql.1045698.n5.nabble.com/convert-in-GMT-time-zone-without-summer-time-tp4304830p4366565.html
Sent from the PostgreSQL - sql mailing list archive at Nabble.com.


Re: convert in GMT time zone without summer time

От
Steve Crawford
Дата:
On 05/03/2011 12:15 AM, LaraK wrote:
> Very good!
>
> Another question:
> I want to convert the string to the type TIMESTAMP WITH TIME ZONE. What do I
> have to format? 'TZ' does not.
>
> select to_timestamp('2011-03-22 14:17:00  Europe/Berlin', 'YYYY-MM-DD
> HH:MI:SS  TZ')
>

Just cast it to a timestamp with time zone:

select timestamptz '2011-04-22 19:17:00 Europe/Berlin';

Remember...

The value of a timestamp with time zone is always stored internally as UTC.

When a timestamp with time zone is displayed, the time zone is based on 
the client's default, the "set timezone to" statement or the "at time 
zone" clause in the query.

In the case of an explicit "at time zone" clause, the result becomes a 
timestamp without time zone data type (that is why the previous static 
example with the "at time zone" clause was a timestamp without time zone).

A timestamp with time zone is useful to identify a specific point in 
time. "Bin Laden's death was announced at...", "shuttle Endeavor 
launched at...", "Amazon EC2 crashed at...". Most timestamp data I 
encounter is of this type.

A timestamp without time zone might be useful for data like "Breakfast 
is served at 7am". Presumably a hotel chain would serve at 7am in each 
hotel and not have all hotels serve at 7am corporate headquarters time.

It takes a bit of time to wrap your head around time and time zones but 
it would be well worth your time to carefully read 
http://www.postgresql.org/docs/8.4/interactive/datatype-datetime.html 
(IIRC, you are using 8.4) a couple times.

Cheers,
Steve