"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

PHP/Datenbanken - Timestamp oder Date?

Obermotz 14.12.2009 - 10:11 2103 12
Posts

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Hi!

Möchte mich nur kurz informieren: Ich sehe immer wieder verschiedenste Ansätze bei der Gestaltung von Datenbanken. Ich verwende recht gerne Timestamps weil ich der Meinung bin, dass damit einfach leichter gerechnet werden kann. Sehe aber immer wieder (auch bei größeren Projekten) den Datetime-Datentyp.
Was bevorzugt ihr und habt ihr einen besonderen Grund dafür?
Betrifft natürlich nicht nur PHP-Programmierer sondern auch alle anderen, die mit dbms arbeiten.

mfg
Bearbeitet von Obermotz am 18.12.2009, 10:17

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25423
Ich bevorzuge Unix-Timestamps (unsigned INT) wo es möglich ist und übernehme einen Großteil des Rechenaufwands in die Programmiersprache. Ist (bei MySQL) in so gut wie jedem Fall performanter.

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4282
Kommt drauf an. Für Geburtsdaten z.B. ist DateTime besser, aber wenns nur darum geht, wann eine Zeile eingetragen wird -> Timestamp.

Neo-=IuE=-

Here to stay
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3232
ich denke auch, auch wenn ich nicht selbst viel programmier, dass wenn es als timestamp verwendet werden soll, dann sollte auch das timestamp-"format" verwendet werden, weil es einfacher zu sortieren ist

für einen output in einer software kann man es ja noch immer umrechnen
für ein abgespeichertes datum ist es wahrscheinlich geschmacksache, ob man es in einem datetime format abspeichert oder es auch umrechnen lässt -> vorteil dabei wäre auch hier, dass man lokalisierte fassungen von benutzerumgebungen nur durch die "umrechnung" anbieten kann, die db aber allgemein gültig ist

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Hey vorsicht.

Wie schon kleinerChemiker geschrieben hat kommt das IMMER auf die Anwendung an, ein UNIX Timestamp für etwa ein Geburtsdatum zu verwenden wird nicht viel Freude bereiten weil der ja erst 1970 anfängt und nebenbei auch nur bis 2038 oder so läuft (UNIX doomsday...). Aber wenn es zb. um ein Log geht dann bringt dir DateTime oft nichts, da is besser du nimmst Timestamp.

Lokalisierung ist natürlich kein Thema, weil das DBMS sowieso nicht so abspeichert wie du übergibst sondern brav umrechnet (oder sollte) in UTC, und dann nach Bedarf richtig ausgeben kann.

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12071
Zitat von watchout
[…] und nebenbei auch nur bis 2038 oder so läuft (UNIX doomsday...)[…].

Huh?

Code:
colo@zealot ~ $ date --date "Now + 100000 Years" +%s
3156956032147
:D

Bis 2038 wird man ja hoffentlich keine 32Bit-Architekturen mehr verwenden ;)

t3mp

I Love Gasoline
Avatar
Registered: Mar 2003
Location: upstairs
Posts: 6280
Code:
Found these USE flags for dev-db/postgresql-base-8.3.8:
[snip]
pg-intdatetime : Enable --enable-integer-datetimes configure option, which changes PG to use 64-bit integer for timestamp storage
:D
Bearbeitet von t3mp am 15.12.2009, 00:22

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Wir (in meiner früheren Firma) haben Daten (also Datümer ;) in diesem Fall, aber das Wort gibts ja nicht) als Integer gespeichert - und zwar in der Form Jahr*10000+Monat*100+Tag.

Vorteil: Das funktioniert mit jeder Programmiersprache, mit jedem Datenbank-API, mit jeder Datenbank, mit jeder Ländereinstellung usw. immer gleich. Ein unschätzbarer Vorteil, wenn man mal mit den verschiedenen Varianten von Formatierungen herumgeeiert hat, die dann plötzlich beim Kunden nicht mehr funktionieren, nur weil der irgendwelche anderen Locale-Settings hat.

Zusätzlich bleibt das Datum für Menschen lesbar (20091215), und die Sortierung stimmt.

Nachteil: Man kann auch unsinnige Daten eintragen (60.35.2009), und man kann nicht direkt in der Datenbank mit den Werten rechnen.

t3mp

I Love Gasoline
Avatar
Registered: Mar 2003
Location: upstairs
Posts: 6280
Zitat von that
Nachteil: Man kann auch unsinnige Daten eintragen (60.35.2009), und man kann nicht direkt in der Datenbank mit den Werten rechnen.
Auch das könnte man ja bis zu einem gewissen Grad mit einer stored procedure lösen. Sonderfälle wie der 29. Feb. verursachen dann noch Kopfschmerzen, sind aber auch kein Ding der Unmöglichkeit.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von COLOSSUS
Huh?

Code:
colo@zealot ~ $ date --date "Now + 100000 Years" +%s
3156956032147
:D

Bis 2038 wird man ja hoffentlich keine 32Bit-Architekturen mehr verwenden ;)
Und in welchen Anwendungsfällen speicherst du nur das aktuelle Datum/Uhrzeit und interessierst dich weder für Zukunft noch Vergangenheit?
Willst du heute den Wochentag deines Geburtstags in 40 Jahren berechnen, hast du auf einem 32 Bit System - von denen es heute noch sehr viele gibt, und oft auch selbst wenn der Prozessor schon 64 Bit könnte - wohl ein Problem. Genauso mit langfristigen Projekten oder sagen wir mal Krediten - ein 30 Jahre Kredit ist nicht so unüblich.


@that: es geht um timestamps oder datetime, soll heißen, dir fehlt noch HH*10000+MM*100+SS*1 und dem Rest fehlen 4 Nullen...
Das Argument mit der Lesbarkeit find ich ziemlich komisch - lesbar? Wodurch? `cat dbfile`? ich bezweifle mal dass du damit einen Integer-Wert erkennst, und in jedem anderen Fall liefert das DBMS für DateTime oder Timestamp einen hübschen String zurück der wesentlich besser lesbar wäre als etwa 20091211112009 (wie spät ist es?). Wer das Datum per Programm weiterverarbeiten muss kann ja auch - absolut unabhängig von jeglichem Locale - das Ausgabeformat spezifizieren (und sollte das ja auch tun), wenn nicht sowieso eine Sprache verwendet wird die "hoch" genug ist wo dann die jeweilige Library sowieso schon direkt ein DateTime Objekt zurückgibt welches alle notwendigen Methoden bereitstellt.

Und wenn die Sortierung nach Datum nicht funktioniert... würde ich das DBMS wechseln

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Zitat von watchout
Das Argument mit der Lesbarkeit find ich ziemlich komisch - lesbar? Wodurch? `cat dbfile`?

"select datum from tabelle". Im Gegensatz zu z.B. einem Unix-Timestamp ist das lesbar.

Zitat von watchout
und in jedem anderen Fall liefert das DBMS für DateTime oder Timestamp einen hübschen String zurück der wesentlich besser lesbar wäre als etwa 20091211112009 (wie spät ist es?). Wer das Datum per Programm weiterverarbeiten muss kann ja auch - absolut unabhängig von jeglichem Locale - das Ausgabeformat spezifizieren (und sollte das ja auch tun)

Es gibt leider keine portable Möglichkeit, das Ausgabeformat zu spezifizieren. Auch der Datentyp für gebundene Query-Parameter ist leider bei jeder Datenbank und bei jedem API anders. Und manche "Datenbanken" (*hust* Access via ADO) schaffen es sogar, in bestimmten Fällen bei binären Parameterformaten abhängig von der Locale-Einstellung Monat und Tag zu vertauschen, netterweise aber nur wenns nachher wieder ein gültiges Datum wird (5.12. wird z.B. zum 12.5., der 15.12. bleibt der 15.12.). :bash: So ein Unfug passiert bei Integers einfach nicht.

Solltest du natürlich einen Weg kennen, wie man mit "echten" Datumsfeldern problemlos umgeht, ohne für jede Datenbank und jedes API einen anderen Hack einbauen zu müssen, dann nur her damit bitte.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Dafür gibts halt das DAO Design Pattern

und zu timestamps:
Code:
mysql> create table timestamp (stamp timestamp, datum datetime);
Query OK, 0 rows affected (0.35 sec)

mysql> insert into timestamp values (now(), now());
Query OK, 1 row affected (0.02 sec)

mysql> select * from timestamp;
+---------------------+---------------------+
| stamp               | datum               |
+---------------------+---------------------+
| 2009-12-15 12:25:07 | 2009-12-15 12:25:07 | 
+---------------------+---------------------+
1 row in set (0.00 sec)
also ich find das is gut lesbar

Bogus

C64 Generation
Avatar
Registered: Mar 2006
Location: Graz
Posts: 3170
<- nutze zu 99,9% timestamp
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz