[PHP/MySQL] Beste? DATETIME of TIMESTAMP

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heyz,

Ik ben al een tijdje bezig met het bouwen van website die een nieuwspagina hebben of iets waarmee tijd wordt opgeslagen. Elke keer gebruik ik eignelijk een andere manier.

DATETIME => dmv. date(Y-m-d H:i:s)
TIMESTAMP => mktime()
TIMESTAMP => date(YmdHis)

Alles heeft zo z'n voor en nadelen. Voor mij is het belangrijk dat ik de volgende dingen kan met de tijd:
- sorteren op laatste toevoeging en/of update
- uitlezen => 11-11 om 13:05

nu kom er ik nou niet uit was de beste manier is om mee te werken.... hoe doen jullie het, wat is jullie reden voor gebruik van ene bepaalde manier? alvast bedankt

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Een timestamp is nauwkeuriger, die gaat tot honderdsten van seconden ipv hele seconden. Normaal gesproken ben je niet zo gauw geinteresseerd in honderdsten. Maar Hibernate bijvoorbeeld kan timestamps gebruiken om mee te versionen. DateTimes zijn hiervoor ongeschikt.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
DATETIME heeft mijn voorkeur. Er zijn namelijk een aantal speciale eigenschappen met TIMESTAMP velden, daarover in de MySQL documentatie meer.

Je kan ook een INT veld gebruiken met unix-timestamps (time()); maar dan zit je altijd te klooien met FROM_UNIXTIME() in je queries en kun je geen data van voor 1970 gebruiken.

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Varienaja schreef op woensdag 09 november 2005 @ 14:06:
Een timestamp is nauwkeuriger, die gaat tot honderdsten van seconden ipv hele seconden. Normaal gesproken ben je niet zo gauw geinteresseerd in honderdsten. Maar Hibernate bijvoorbeeld kan timestamps gebruiken om mee te versionen. DateTimes zijn hiervoor ongeschikt.
Dat is niet waar, in PHP gaat time() maar tot seconden. Je bent waarschijnlijk in de war met Java / Javascript, waar timestamps in miliseconden zijn.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Gebruik datetime als je een datum/tijd wilt opslaan, zoals bijvoorbeeld bij een nieuws item, of iemand z'n verjaardag (alleen date uiteraard), etc. Indices zijn op dit type veld geoptimaliseerd en er zijn bergen date/time functies in MySQL.

Gebruik een timestamp-veld als het om een timestamp van de record gaat. In MySQL worden deze (of de eerste althans) ook automatisch bij iedere insert/update gewijzigd.

Timestamp in een int/varchar veld heb je zelden nodig, tenzij je ook microsecondes wilt opslaan oid. Met een normaal int veld kom je dan qua grootte ook al snel in de problemen.

Wil je je date/time in bijvoorbeeld PHP doorverwerken als timestamp (bijvoorbeeld als invoer voor date oid), gebruikdan MySQL's UNIX_TIMESTAMP-functie om je datetime te converteren.

[ Voor 34% gewijzigd door Bosmonster op 09-11-2005 14:34 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik zou gewoon voor de datetime gaan. Overigens kun je de huidige datum in een SQL query gewoon opvragen met NOW(). Daar hoeft php helemaal voor niet aan te pas komen. Zie deze pagina voor alle datum en tijd gerelateerde functies. Let wel even op dat je de juiste versie hebt.

[ Voor 4% gewijzigd door Michali op 09-11-2005 14:33 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Bosmonster schreef op woensdag 09 november 2005 @ 14:29:
Gebruik een timestamp-veld als het om een timestamp van de record gaat. In MySQL worden deze (of de eerste althans) ook automatisch bij iedere insert/update gewijzigd.
Bovendien kun je AFAIK maar één TIMESTAMP veld per tabel hebben, omdat ze anders toch altijd maar dezelfde waarde zouden hebben.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Timestamp van mysql wijzigt met elke update van dat record mee, alleen om die reden zou je hem al zo veel mogelijk moeten mijden.
De andere twee oplossingen zijn met de php/mysql-combinatie lastiger te beoordelen. Want helaas zijn ze bij php een fatsoenlijk datum-formaat vergeten, waardoor je daar vrij gauw aan de unix timestamps vast zit. In principe zou je er namelijk gewoon het datetime-type voor horen te gebruiken in je database, dat type is er tenslotte voor gemaakt en staat je allerlei interessante functies toe die je met unix timestamps eigenlijk niet hebt (een maand is tenslotte niet 30x 86400).

Echter is het weer zo'n geklooi in php om met een datetime te werken... je zou dus als je het vooral voor php's verwerking opslaat in een unsigned integer op kunnen slaan en anders de datetime kunnen gebruiken. Timestamp is imho niet zo zinvol op MySQL, tenzij je juist een "laatste update van dit record" dingetje wilt bijhouden.
Overigens is in ANSI SQL Datetime een synoniem voor Timestamp en is Timestamp dus het "datum en tijd"-type.

[ Voor 4% gewijzigd door ACM op 09-11-2005 14:36 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

-NMe- schreef op woensdag 09 november 2005 @ 14:33:
[...]

Bovendien kun je AFAIK maar één TIMESTAMP veld per tabel hebben, omdat ze anders toch altijd maar dezelfde waarde zouden hebben.
Ik weet niet hoe het tegenwoordig is (gebruik het veld zelden), maar in vroegere MySQL versies kon je wel meerdere timestamp velden hebben, maar werd alleen de eerste in de veldvolgorde ook automatisch geupdate.

Ik geloof dat in nieuwere versies je bij een timestamp kunt kiezen of die auto-update is ofzo.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
-NMe- schreef op woensdag 09 november 2005 @ 14:33:
Bovendien kun je AFAIK maar één TIMESTAMP veld per tabel hebben, omdat ze anders toch altijd maar dezelfde waarde zouden hebben.
Alleen de eerste wordt dan aangepast, maar je mag er wel meerdere hebben. Bij versie 5.0 hebben ze er wat aan verandert, wat precies weet ik niet meer.

edit:

(gelukkig post Bosmonster vrijwel hetzelfde als ik, maakt mijn reactie zo zinvol :-X ;-) )
En dan doet ie het ook gelijk maar 3x

[ Voor 14% gewijzigd door ACM op 09-11-2005 14:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is dus heel erg waar je voorkeur ligt..... Ik denk dan toch dat ik het op DATETIME houd......

Even ene paar functies schrijven die het omzetten van DATETIME =>
2005-11-09 14:53:22
omschrijft naar =>
09.11 om 14:53

maar dat moet lukken. omgekeerd het aanmaken is natuurlijk wel goed te doen.

tnx

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Verwijderd schreef op woensdag 09 november 2005 @ 14:53:
Het is dus heel erg waar je voorkeur ligt..... Ik denk dan toch dat ik het op DATETIME houd......

Even ene paar functies schrijven die het omzetten van DATETIME =>
2005-11-09 14:53:22
omschrijft naar =>
09.11 om 14:53
Daar is date_format toch prima voor te gebruiken ?
maar dat moet lukken. omgekeerd het aanmaken is natuurlijk wel goed te doen.
En daar is from_unixtime voor bedoeld, voor zover je dat uberhaupt nodig hebt, want now() en current_datetime zijn natuurlijk altijd beschikbaar.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

In de database gebruik ik gewoon date(time) (afhankelijk van of ik ook een tijd nodig heb). Binnen php scripts onthoud ik ze in unix timestamps. Voor het afdrukken gebruik ik een methode die een format string en een timestamp vraagtdate_format. Deze format string is vervolgens onderdeel van de (applicatie of gebruikers) configuratie.

[ Voor 3% gewijzigd door Janoz op 09-11-2005 15:05 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik gebruik in MySQL int om te voorkomen dat ik in queries telkens van/naar timestamp moet converteren en omdat MySQL bij timestamp gaat klooien met tijdzones.
Pagina: 1