[PHP/MySQL] Rekenen met timestamps

Pagina: 1
Acties:
  • 1.725 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik heb een database tabel met daarin een groot aantal persberichten. Bij elk persbericht is de publicatiedatum dmv een timestamp opgeslagen.

Ik wil nu via de querystring een overzicht kunnen oproepen van de persberichten op een bepaalde dag, in een bepaalde maand of in een bepaald jaar, bijvoorbeeld
code:
1
2
3
4
5
6
7
8
// alle persberichten van 17 juni 2002:
persberichten.php?jaar=2002&maand=06&dag=17

// alle persberichten van november 1999
persberichten.php?jaar=1999&maand=11

// alle persberichten van 2005
persberichten.php?jaar=2005

Ik weet alleen niet hoe ik dit op een goede manier moet oplossen. Ik kom niet veel verder dan:
  • request voor juni 2004
  • juni heeft 30 dagen, dus ik reken de timestamp uit van 1 juni 2004 0:00 uur (1) en van 30 juni 2004 23:59 uur (2)
  • ik vuur een query op de database af met WHERE clause timestamp is tussen (1) en (2)
Dit is volgens mij veel te bewerkelijk. En ik voorzie al problemen, bijvoorbeeld als ik ook rekening moet gaan houden met schrikkeljaren, etc. Er moet hier gewoon een makkelijker manier voor zijn, bijvoorbeeld via bepaalde mysql functies? Die website is echter zo groot, dat ik door de bomen het bos niet meer zie. En misschien is een PHP oplossing veel beter. Wie legt mij het principe uit? Uitwerken kan ik dan zelf wel; wil alleen graag wat aanknopingspunten :)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

Het is wel op te lossen met de Date and Time Functions

Acties:
  • 0 Henk 'm!

Verwijderd

je moet je data (datums) gewoon opslaan als DATE (of DATETIME)

dan kun je met WHERE YEAR(datum)=2004 AND MONTH(datum)=11 alles van november 2004 ophalen.

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik gebruik nu de volgende INSERT query (enigszins vereenvoudigd):
SQL:
1
INSERT INTO stories (body, created) VALUES ($edit['body'], time());
In de database heeft "created" int(10) als kolomtype. Als ik het goed begrijp, moet ik de kolomtype dus veranderen van int(10) naar DATE (of DATETIME). Dan kan ik daarna mijn query aanpassen naar
SQL:
1
SELECT FROM stories WHERE YEAR(created)=2004 AND MONTH(created)=11

Als bovenstaande klopt, heb ik nog enkele vragen:
  • gebruik ik in de INSERT query nog steeds time() om de created kolom te vullen?
  • wat is het verschil tussen DATE en DATETIME en TIMESTAMP?
  • ik neem aan dat als ik een DATE opvraag uit de database, ik deze waarde ook in PHP kan terugrekenen naar een leesbaar formaat mbv getdate()?

[ Voor 2% gewijzigd door Reveller op 11-07-2005 15:26 . Reden: layout, typo's ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

Reveller schreef op maandag 11 juli 2005 @ 15:25:
Als bovenstaande klopt, heb ik nog enkele vragen:
  • gebruik ik in de INSERT query nog steeds time() om de created kolom te vullen?
  • wat is het verschil tussen DATE en DATETIME en TIMESTAMP?
  • ik neem aan dat als ik een DATE opvraag uit de database, ik deze waarde ook in PHP kan terugrekenen naar een leesbaar formaat mbv getdate()?
ik weet niet of die query perfect is (zo ff uit mijn hoofd, heb al een tijdje geen mysql gebruikt), maar dat moet je kunnen oplossen met die link van Nokia.

informatie over die kolomtypen kun je ook op dev.mysql.com vinden. timestamp (als je tenminste het kolomtype timestamp van mysql bedoelt?) heb ik nooit gebruikt omdat dat in mysql niet echt goed werkte ofzo. verschil tussen date en datetime is zoals de naam als zegt, dat de een alleen de datum opslaat en de ander ook de tijd.

je kunt hiervoor niet getdate() gebruiken, want, zoals je kunt lezen op php.net/getdate, getdate() wil een unix timestamp/int (geen mysql timestamp) als argument, en als je een date veld normaal uitleest krijg je een string. MySQL zelf heeft hier wel functies voor die je meteen in je query gebruikt, zie weer de link van Nokia (hint: DATE_FORMAT()). Dan hoef je er binnen php niks meer mee te doen.

[ Voor 14% gewijzigd door Verwijderd op 11-07-2005 15:38 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Reveller schreef op maandag 11 juli 2005 @ 15:25:
Ik gebruik nu de volgende INSERT query (enigszins vereenvoudigd):
Als bovenstaande klopt, heb ik nog enkele vragen:
  • gebruik ik in de INSERT query nog steeds time() om de created kolom te vullen?
  • wat is het verschil tussen DATE en DATETIME en TIMESTAMP?
  • ik neem aan dat als ik een DATE opvraag uit de database, ik deze waarde ook in PHP kan terugrekenen naar een leesbaar formaat mbv getdate()?
1.Dat kan, je kunt gebruik maken van de FROM_UNIXTIME() functie bij het inserten en/of updaten.

2.DATE is een datum, DATETIME een datum en tijd. In TIMESTAMP wordt een unix timestamp opgeslagen. Deze heeft default de huidige datum en tijd en verandert in principe bij elke update naar de dan geldende datum (tenzij je er een specifieke waarde voor opgeeft that is).

3.Je kunt uit een DATETIME nog gewoon een timestamp opvragen met behulp van UNIX_TIMESTAMP(datetime_field). Met beulp van andere date-format functies kun je echter eigenlijk elk gewenst formaat wel voor elkaar krijgen.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
T-MOB schreef op maandag 11 juli 2005 @ 15:40:
[...]
3.Je kunt uit een DATETIME nog gewoon een timestamp opvragen met behulp van UNIX_TIMESTAMP(datetime_field). Met beulp van andere date-format functies kun je echter eigenlijk elk gewenst formaat wel voor elkaar krijgen.
Het is me nu duidelijk dat je in principe net zo makkelijk / snel met datetime's als timestamp's kunt werken. Ik heb ook wat open-source weblogs bekeken om te zien waar zij zich van bedienen. Wat opvalt is dat sommigen de datum / tijd waarop een weblog-entry in de database wordt gestopt opslaan als een datetime (bv. 2005-07-21 20:52:32) en sommigen als een timestamp mbv PHP's time() (bv. 1121786074). Bijna allemaal slaan ze mbv. MySQL TIMESTAMP op wanneer een post ge-edit werd (bv. 20050721134427). Er zijn er die in de database op twee manieren opslaan wanneer er een entry wordt toegevoegd: in het MySQL DATETIME veld en in een timestamp (int(10)) mbv PHP's time() functie. Ik heb hierover twee vragen:
  • Als je alles naar alles kunt omrekenen (timestamp <--> datatime), wat is dan het beste om in je database op te slaan? Ik denk dat performance argumenten niet zo belangrijk zijn: er zit denk ik niet veel verschil in load. Als je opslaat mbv DATETIME zul je wat meer in de database moeten rekenen (queries als SELECT SUBSTRING(date_created, 1, 10) als je alleen de datum wilt hebben), als je opslaat mbv PHP's time() functie zul je wat meer in PHP moeten rekenen (bv. $day_of_week = date('w', time()), maar dat verschil is denk ik miniem. Is er iets waar ik overheen kijk? Wat is het voordeel van de een boven de ander?
  • Ik weet dat een timestamp gemaakt mbv PHP (time()) het aantal seconden is vanaf 1 januari 1970 - een UNIX-timestamp volgens php.net in 10 cijfers. Maar wat is dan een timestamp gemaakt met de NOW() functie van MySQL? Deze is altijd 14 cijfers en is van de vorm 20050721134427. Natuurlijk is dit jaar 2005, maand 07 en dag 21 - maar wat betekent de laatste 134427?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Wacky
  • Registratie: Januari 2000
  • Laatst online: 05-09 21:19

Wacky

Dr. Lektroluv \o/

13:44:27 ... oftewel 13 uur 44 en 27 seconden :)

Nu ook met Flickr account


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21-09 12:54
Reveller schreef op donderdag 21 juli 2005 @ 22:17:
[...]
Als je alles naar alles kunt omrekenen (timestamp <--> datatime), wat is dan het beste om in je database op te slaan? Ik denk dat performance argumenten niet zo belangrijk zijn: er zit denk ik niet veel verschil in load. Als je opslaat mbv DATETIME zul je wat meer in de database moeten rekenen (queries als SELECT SUBSTRING(date_created, 1, 10) als je alleen de datum wilt hebben), als je opslaat mbv PHP's time() functie zul je wat meer in PHP moeten rekenen (bv. $day_of_week = date('w', time()), maar dat verschil is denk ik miniem. Is er iets waar ik overheen kijk? Wat is het voordeel van de een boven de ander?
Het hangt veelal af van het doel wat je jezelf van te voren stelt, ook icm met de requirements voor je website. Ik kan me heel goed voorstellen dat je soms het tijdrekenen helemaal zelf onder controle wilt hebben, bijvoorbeeld met het oog op ondersteuning van verschillende typen database. Een andere keer ligt het gewoon vast dat de database bijvoorbeeld MySQL is, dan zullen er genoeg mensen zijn die ook van database specifieke functies gebruik willen maken.

Daarnaast is er ook nog de persoonlijke smaak van een programmeur. Meestal wil je het voor jezelf zo simpel mogelijk houden en ga je niet onnodige acties uithalen als een reeds bestaande functionaliteit hetzelfde biedt.

Zelf sla ik tijden altijd op als een unixtimestamp, een simpele integer. De manier van werken is voor mij dan altijd hetzelfde, waardoor ik simpel en snel met tijden en datum's kan gaan rekenen.

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Sybr_E-N schreef op donderdag 21 juli 2005 @ 23:06:
[...]
Zelf sla ik tijden altijd op als een unixtimestamp, een simpele integer. De manier van werken is voor mij dan altijd hetzelfde, waardoor ik simpel en snel met tijden en datum's kan gaan rekenen.
Voor de duidelijkheid: wat versta jij onder een unix timestamp? Een timestamp gemaakt met PHP's time() functie, bv. 1121786074 of een MySQL timestamp gemaakt met now(), bv. 20050721134427? Ik vind het erg verwarrend dat er twee totaal verschillende timestamps zijn

:?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Een UNIX timestamp is inderdaad datgene dat je genereert met de time() functie (of met date('U') -> is hetzelfde). UNIX timestamp is het aantal seconden dat verstreken is sinds 1 januari 1970.

Wanneer je je UNIX timestamp als tweede argument meegeeft aan de date() functie, kun je in PHP vervolgens dit aantal seconden weer omzetten in een ander datum-formaat.
Pagina: 1