Fragen zu Timestamp with timezone + Formatierung

Hallo Leute,

ich werkle gerade an einem Tagebuch, das ich für News die ich von meiner Guatemalareise aus schreibe benötige. Ich möchte die Zeit und Datum formatiert angeben. (bin noch php und postgreSql Neuling)

Ich überlege nun wie ich es lösen soll.

Bis jetzt habe ich es so gemacht:

…VALUES (’$titel’, ‘$wetter’, current_timestamp, ‘$eintrag’)";
so wurde die Zeit in die Datenbank rein geschrieben.
Sieht dann zum Beispiel so aus: 2007-03-08 16:12:01+01

Jetzt überlege ich wie ich es passend formatieren kann.
Ich benötige die Zeit mit GMT +1 und die, die es gerade in Guatemala hat. (GMT -6)

Wie kann man den mit to_char oder so arbeiten?
Kann ich so wie die Zeit in der Datenbank ist, auch mit den normalen php Funktionen arbeiten? (dachte eher nicht, weil die ja mit Unix Timestamp arbeiten?)

Soll ich es ohne PostGre Funktionen lösen, und einfach mit den Standard PHP Funktionen machen?

Na ja, bitte helft mir ein bisschen mit eurer Erfahrung weiter.

Danke im voraus für sinnvolle Hilfe.
lg Darian

Hi, so wie ich das sehe funktionieren die php Befehle wie date() nicht mit den Timestamp von Postgre. Ihr könnt mich ruhig eines besseren belehren. :slight_smile:

Entweder ich arbeite jetzt mit dem Unix Timestamp weiter, oder ich schaffe es irgendwie mit den PG Funktionen.

Bitte um Hilfe
lg Daniel

Wenn ich Google richtig parse, ist das dann ‘CST’:

test=*# select now(), now() at time zone 'cst';
              now              |          timezone
-------------------------------+----------------------------
 2007-03-09 18:02:52.782882+01 | 2007-03-09 11:02:52.782882
(1 row)

Du brauchst nur einen Wert zu speichern :wink:

Wie kann man den mit to_char oder so arbeiten?

Ich habe was ähnliches erst gestern, oder vorgestern, hier gezeigt.
Hint: speichere in timestamptz. Dann kannst Du das immer in eine lokale Zeit umrechnen. Exakt dazu dient dieser Datentyp.

Kann ich so wie die Zeit in der Datenbank ist, auch mit den normalen php Funktionen arbeiten? (dachte eher nicht, weil die ja mit Unix Timestamp arbeiten?)

PG selbst kann mit Zeitzonen rechnen. Sehr gut sogar. Dazu brauchts keiner externen Schweinereien.

Andreas

Hallo, gleich einmal danke für deine Hilfe.
Ist mir aber nicht klar was du da meinst.

Datentype: timestamp(0) with time zone

$pgsql_Befehl = "INSERT INTO tagebuch (titel, wetter, datum, eintrag)
VALUES ('$titel', '$wetter', current_timestamp, '$eintrag')"; 

Ist das einmal richtig? ich speichere es zuerst mit current_timestamp, oder gleich irgendwie anders?

Und warum diesen Code?

select now(), now() at time zone ‘cst’;

lg Darian

Ich meine, es reicht, eine Zeit mit Zeitzone zu speichern. Der Rest ist berechenbar.

 
test=# select now() at time zone 'cet';
          timezone
----------------------------
 2007-03-09 20:29:50.242964
(1 row)

Time: 0.703 ms
test=*# select now() at time zone 'cst';
          timezone
----------------------------
 2007-03-09 13:29:50.242964
(1 row)

Mit anderen Worten: während wir schon müde werden, habt ihr grad Mittagsschlaf.

Andreas

Und juhu, es hat funktioniert, und war ja irgendwie fast zu einfach…Danke dir!

$pgsql_Befehl = "SELECT titel, wetter, datum, datum at time zone 'cst' as
datumgut, eintrag FROM tagebuch"; 

Aber wie kann man es nun formatieren, es ist ja schon ausgegeben? Oder jetzt doch mit php Befehlen?

lg Darian

Bidde.

Aber wie kann man es nun formatieren, es ist ja schon ausgegeben? Oder jetzt doch mit php Befehlen?
lg Darian

Das Handbuch widmet dieser Frage ein ganzes Kapitel:

Wie wäre es, dies mal zu lesen?

Hint: to_char() kann man in der select-Liste verbuddeln.

Andreas

Hi,

jap, ich habe das eh schon gelesen, war mir nur nicht sicher ob man das in den select verbuddelt oder nicht. Aber wenn es so ist, wird es wohl kein so ein großes Problem sein nehme ich an.

Ich habe es wie normale funktionen behandelt… :smiley:

Danke für deine Hilfe…

lg Darian

Hallo nocheinmal, habe es jetzt eigentlich ohne Probleme hin bekommen. Und so geht man mit allen Funktionen in PG um oder wie? (immer im select?)

Danke für deine Hilfe, geht mit PG Funktionen ja wirklich sehr fein, hätte ich nicht gedacht. Da wäre man ja blöd mit UNIX Timestamp irgendwie in PHP herum zu rechnen.

lg Darian

Nein, Funktionen kannst Du auch im FROM, WHERE, ORDER etc. verwenden, und auch in UPDATE oder DELETE - Befehlen.

Andreas

Ok verstehe, habe da aber über das verwenden von den funktionen nirgends wo was gefunden. Hast du da vielleicht irgendwo einen link wo da genauere beispiele aufgeführt sind (das erklärt wird)

Mein erster versuch war nämlich es als ganz normale php funktionen zu benutzen (was eigentlich eh unlogisch ist)

<?php
to_char(current_timestamp, 'HH12:MI:SS)
?>

lg Darian

Edit: Gibt es solche Funktionen bei MySQL eigentlich auch, oder ist PostGre Spezifisch (nur weil ich gerade versuche Gedanklich die Unterschiede der Datenbanken zu erfassen; Vorteil Nachteil Vergleich)

Die Doku ist voll davon…

Mein erster versuch war nämlich es als ganz normale php funktionen zu benutzen (was eigentlich eh unlogisch ist)

<?php to_char(current_timestamp, 'HH12:MI:SS) ?>
>

Du willst etwas haben, etwas selektieren. Daher brauchst Du dort ein select.

```text
-- Funktion als FROM-Quelle
test=# create function get_one() returns int as $$begin return 1; end; $$ language plpgsql;
CREATE FUNCTION
Time: 418.964 ms
test=*# select * from get_one();
 get_one
---------
       1
(1 row)



-- selbe Funktion als Sortierkriterium
test=*# select * from foo order by c;
 a | b | c
---+---+---
 1 | 1 | 1
 1 |   | 3
 2 | 3 | 4
(3 rows)

Time: 1.231 ms
test=*# select * from foo order by get_one();
 a | b | c
---+---+---
 1 |   | 3
 2 | 3 | 4
 1 | 1 | 1
(3 rows)



-- selbe Funktion als Teil im WHERE
test=*# select * from foo where a=get_one();
 a | b | c
---+---+---
 1 |   | 3
 1 | 1 | 1
(2 rows)

Einfach mal a bissl spielen…


Edit: Gibt es solche Funktionen bei MySQL eigentlich auch, oder ist PostGre Spezifisch (nur weil ich gerade versuche Gedanklich die Unterschiede der Datenbanken zu erfassen; Vorteil Nachteil Vergleich)

Der Hauptunterschied zu MySQL ist der Geruch. MySQL stinkt.

Nein, MySQL hat wohl auch die Möglichkeit, Funktionen zu schreiben. In PG kannst Du das aber in zig Sprachen tun, und damit ist es wohl auch so manchem kommerziellem Produkt überlegen.
Aber man kann nicht sagen, plpgsql sein PG-spezifisch, weil es einklich eine direkte Antwort auf Oracles Programmiersprache ist.


Andreas