PHP.EE FOORUM   
Nimi:   Pass:   Mäleta mind! 
   Teemad | php.ee esilehele | registreeri | Märgi kõik teemad loetuks | #php.ee Skype vestlus | RSS
UUS TEEMA  OTSI  Lehekülgi: 1
Kuupäeva eesti formaadis printimine
Postitaja: veiks 2009-04-06 19:46:10
Loen Mysql andmebaasist lisaks muudele väljadele kuupäeva. Väljaprintimisel tahaksin printida dd.mm.yy kujul, kuid ei leia sobivat funktsiooni, millega seda teha (date_format funktsioon annab vea teatades, et argument peab olema date-time muutuja). PHP manualis on kõik näited seotud serveri date-time muutujaga.
RE: Kuupäeva eesti formaadis printimine
Postitaja: Endel 2009-04-06 21:59:28
date() võtab sisse unix timestambi <http://ee.php.net/manual/en/function.date.php>. Formaat on sama mis datetime_format()'il.
RE: Kuupäeva eesti formaadis printimine
Postitaja: veiks 2009-04-07 13:31:07
Taipasin ise. Andmebaasist saadud kuupäev on string muutuja ja eesti kuupäeva formaadi saamiseks tuleb kasutada funktsiooni substr()
RE: Kuupäeva eesti formaadis printimine
Postitaja: Endel 2009-04-07 13:46:24
On jah string, aga kui sa tahad tulevikus kergemini pääseda, siis tekita endale kaks eri funktsionaalsust:

1) MySQL timestamp -> PHP DateTime objekt (või UNIX timestamp, kui PHP <5.2)
2) PHP datetime/unixts -> lokaliseeritud formaat
RE: Kuupäeva eesti formaadis printimine
Postitaja: rtfm 2009-04-07 14:08:32
formaadi kohe querys ära date_format() , mysqli manualist tseki
RE: Kuupäeva eesti formaadis printimine
Postitaja: zeratul 2009-04-07 14:16:52
Ütle palun üks hea põhjus, miks peab mysql baasis kuupäeva hoidma datetime formaadis aga mitte integer formaadis?

Integer puhul kirjutad ühe korra php tasandil strtotime() funktsiooni kasutades baasi ning välja kuvamise jaoks teed view tasemele täpselt nii palju funktsioone, kui palju on sul erinevaid formaate vaja välja näidata. Boonusena hoiad mysql ressurssi date_format pealt kokku.
RE: Kuupäeva eesti formaadis printimine
Postitaja: Endel 2009-04-07 15:35:28
TSITEERITUD:
Ütle palun üks hea põhjus, miks peab mysql baasis kuupäeva hoidma datetime formaadis aga mitte integer formaadis?

Integer puhul kirjutad ühe korra php tasandil strtotime() funktsiooni kasutades baasi ning välja kuvamise jaoks teed view tasemele täpselt nii palju funktsioone, kui palju on sul erinevaid formaate vaja välja näidata. Boonusena hoiad mysql ressurssi date_format pealt kokku.


Baasist andmeid vaadates on aru saada, millega on tegu. Pole vaja optimeerida kohta, kus seda vaja ei ole.

strtotime() ei ole väga usaldusväärne - ta võib päeva ja kuu asukohta valesti tõlgendada.
RE: Kuupäeva eesti formaadis printimine
Postitaja: rtfm 2009-04-07 17:28:59
TSITEERITUD:
Ütle palun üks hea põhjus, miks peab mysql baasis kuupäeva hoidma datetime formaadis aga mitte integer formaadis?

Integer puhul kirjutad ühe korra php tasandil strtotime() funktsiooni kasutades baasi ning välja kuvamise jaoks teed view tasemele täpselt nii palju funktsioone, kui palju on sul erinevaid formaate vaja välja näidata. Boonusena hoiad mysql ressurssi date_format pealt kokku.


ee mm ja kogu ajaparameetrilise andmekogu sorteerid phps ja ei tee seda kohe päringuga? Sellesuhtes edu sulle miljoni rea töötlemisel ja ajaliste võrdluste puhul on mysqli ressurss tunduvalt odavam, kui kogu andmestik välja pumbata, töödelda ja ebavajalik minema visata.

Mysqlil on suht mugavad time funktsioonid muideks
RE: Kuupäeva eesti formaadis printimine
Postitaja: blaa 2009-04-07 20:44:01
need, kes kasutavad mysqli kuupäeva/aja tüüpe, neil on kaks korda aastas süsteemis anomaaliad. Siis kui kella keeratakse.

tehke kasvõi lihtne test, keerake oma arvuti kell mõni minut enne sügiseset kellakeeramise aega. Pange baasi igal minutil kirje, esimeses veerus auto_increment(int), teises now()(mysql-datetime) ja kolmandas unixtimestamp(int) ehk php time() väärtus.
Kuvage peale iga sisestust baasi kirjed välja sorteerituna datetime veeru järgi, ning selle alla ka kogu baas sorteerituna int-timestampi järgi.
Ei lähe palju aega mööda, kui tekib wtf moment.

RE: Kuupäeva eesti formaadis printimine
Postitaja: blaa 2009-04-07 20:50:08
TSITEERITUD:

Sellesuhtes edu sulle miljoni rea töötlemisel ja ajaliste võrdluste puhul on mysqli ressurss tunduvalt odavam, kui kogu andmestik välja pumbata, töödelda ja ebavajalik minema visata.


enamjaolt sa ikka tead, millist ajavahemikku sa baasist kätte saada tahad. Kui tahad saada kõiki nt mingi kuu kirjeid siis saad php-s ju väga lihtsalt välja arvutada kaks ajatemplit mktime(0,0,0,3,1,2007) ja mktime(0,0,-1,3+1,1,2007) ning kasutada neid päringus betweeniga.

tõsi, timestampiga on keerulisem võtta välja 10 aasta ainult märtsi kirjed, aga enamasti ei ole sellist asja vaja.
RE: Kuupäeva eesti formaadis printimine
Postitaja: Endel 2009-04-07 22:18:05
TSITEERITUD:
enamjaolt sa ikka tead, millist ajavahemikku sa baasist kätte saada tahad. Kui tahad saada kõiki nt mingi kuu kirjeid siis saad php-s ju väga lihtsalt välja arvutada kaks ajatemplit mktime(0,0,0,3,1,2007) ja mktime(0,0,-1,3+1,1,2007) ning kasutada neid päringus betweeniga.

tõsi, timestampiga on keerulisem võtta välja 10 aasta ainult märtsi kirjed, aga enamasti ei ole sellist asja vaja.


Misiganes... Sa ei võida sellega suurt sittagi, tekitad ainult ebamugavusi endale.
RE: Kuupäeva eesti formaadis printimine
Postitaja: /me 2009-04-08 10:31:36
TSITEERITUD:
Ütle palun üks hea põhjus, miks peab mysql baasis kuupäeva hoidma datetime formaadis aga mitte integer formaadis?

Integer puhul kirjutad ühe korra php tasandil strtotime() funktsiooni kasutades baasi ning välja kuvamise jaoks teed view tasemele täpselt nii palju funktsioone, kui palju on sul erinevaid formaate vaja välja näidata. Boonusena hoiad mysql ressurssi date_format pealt kokku.

strtotime ei suuda parsida kuupäevasid, mis on enne 1901-12-13 või pärast 2038-01-19
RE: Kuupäeva eesti formaadis printimine
Postitaja: blaa 2009-04-08 15:03:15
TSITEERITUD:

strtotime ei suuda parsida kuupäevasid, mis on enne 1901-12-13 või pärast 2038-01-19


jah, kui sa vajad inimese vanuse või ajaloosündmustega seoses sekunditäpsust, kasuta datetime'i
RE: Kuupäeva eesti formaadis printimine
Postitaja: jah 2009-04-08 20:42:55
TSITEERITUD:
need, kes kasutavad mysqli kuupäeva/aja tüüpe, neil on kaks korda aastas süsteemis anomaaliad. Siis kui kella keeratakse.

tehke kasvõi lihtne test, keerake oma arvuti kell mõni minut enne sügiseset kellakeeramise aega. Pange baasi igal minutil kirje, esimeses veerus auto_increment(int), teises now()(mysql-datetime) ja kolmandas unixtimestamp(int) ehk php time() väärtus.
Kuvage peale iga sisestust baasi kirjed välja sorteerituna datetime veeru järgi, ning selle alla ka kogu baas sorteerituna int-timestampi järgi.
Ei lähe palju aega mööda, kui tekib wtf moment.



WTF moment tekib vast ikka üks kord aastas. Kevadel saab Eestis kell peale 02:59-t kohe 04:00, 1 tund jääb vahele ja see ei riku sorteerimistulemust.

Aga sügisel saab kell kaks korda päevas 03:00

Loogiliselt võttes on mõlemad kellaajad baasis ju õiged, kuigi Universumis leidsid nad aset 1 tunnise vahega. Tegemist on lihtsalt lokaalse ajatsooni oodatava käitumisega, millega peab kriitilises rakenduses lokaliseeritud aegade baasi salvestamisel arvestama.

Mitte et ma ise seda _alati_ teeks (rääkida on ikka kergem kui teha :)) aga wtf ei teki, kui datastoresse panna aeg alati UTC/GMT-s ning "vaates" ehk väljundis storest võetud aeg lokaliseerida.

Samamoodi on ju UNIX timestamp sekundite arv punktist "1970-01-01 00:00:00 (GMT +00:00)" mille PHP date() funktsioon kuvab soovitud formaadis ning serveris määratud ajatsoonis.

Kui tsiteeritav kodanik oma näitesse ridade välja kuvamisel neljanda tulba lisab, kuhu tulevad väärtused date("Y-m-d H:i:s", int-timestamp-väli)-st, siis saab selles tulbas ka kell ilusti 2x 03:00

date() funktsioonil on analoog gmdate(), mis kuupäeva/kellaaja ilusti GMT-s väljastab, seega on GMT-s aegade baasi panek lihtsalt harjumise asi:

mysql_query ("INSERT INTO tabel SET kuupaev='" . gmdate("Y-m-d H:i:s") . "'");


Ise olen enamasti eelistanud siiski DATE ja DATETIME tüüpe kuna MYSQL-i kuupäevaalgebra on väga mugavaks ja advanceks tehtud: kuude, aastate jne. liitmine/lahutamine on kordades odavam ja lihtsam kui UNIX timestambi puhul. Kogu arvutus toimub MySQL serveris ning PHP skripti pole vaja arvutamiseks midagi tõmmata.

Samuti on lihtsamad ja kiiremad sellised päringud, mis otsivad konkreetse kuupäevaga seotud rida (indekseeritud DATE väli).

Aga on loomulikult olukordi, kus unix timestamp on mõistlikum ja optimaalsem...
RE: Kuupäeva eesti formaadis printimine
Postitaja: blaa 2009-04-08 21:25:56
TSITEERITUD:


WTF moment tekib vast ikka üks kord aastas. Kevadel saab Eestis kell peale 02:59-t kohe 04:00, 1 tund jääb vahele ja see ei riku sorteerimistulemust.


mu näide oli meelega sügise kohta, kevadel on järgmine anomaalia.

Ülesanne, kuvada kõik maksimaalselt tund aega vanad kirjed. Kellakeeramise öösel kell 4 ei saa ühtegi kirjet, sest viimane kirje on templiga 2:59:59, aga reaalselt lisati see kirje sekund tagasi.
RE: Kuupäeva eesti formaadis printimine
Postitaja: jah 2009-04-08 22:01:16
TSITEERITUD:


mu näide oli meelega sügise kohta, kevadel on järgmine anomaalia.

Ülesanne, kuvada kõik maksimaalselt tund aega vanad kirjed. Kellakeeramise öösel kell 4 ei saa ühtegi kirjet, sest viimane kirje on templiga 2:59:59, aga reaalselt lisati see kirje sekund tagasi.


Kasuta aegade salvestamisel GMT-d ja Su probleemid kaovad.

Kui Sa selle väljaga tõesti midagi muud ei tee kui ainult pärid ridu, mis on tehtud viimase tunni aja sees, siis piisab ka unix timestampist.

Nagu ma mainisin, siis kõik oleneb olukorrast.
RE: Kuupäeva eesti formaadis printimine
Postitaja: zeratul 2009-04-09 16:31:34
TSITEERITUD:


ee mm ja kogu ajaparameetrilise andmekogu sorteerid phps ja ei tee seda kohe päringuga? Sellesuhtes edu sulle miljoni rea töötlemisel ja ajaliste võrdluste puhul on mysqli ressurss tunduvalt odavam, kui kogu andmestik välja pumbata, töödelda ja ebavajalik minema visata.

Mysqlil on suht mugavad time funktsioonid muideks


Ei mõsita, miks ei peaks saama unix timestampiga ajavahemikku pärida? Mille poolest peaks süsteem "between 1234567 and 1234567" variandiga halvemini hakkama saama, kui "between '2006-11-12 12:23' and '2006-12-12 12:23'" variandiga?
RE: Kuupäeva eesti formaadis printimine
Postitaja: rtfm 2009-04-09 20:08:02
TSITEERITUD:


Ei mõsita, miks ei peaks saama unix timestampiga ajavahemikku pärida? Mille poolest peaks süsteem "between 1234567 and 1234567" variandiga halvemini hakkama saama, kui "between '2006-11-12 12:23' and '2006-12-12 12:23'" variandiga?


DATE_SUB(CURDATE(),INTERVAL -30 DAY) jne jne vägapalju ajatehteid saab teha otse päringus
RE: Kuupäeva eesti formaadis printimine
Postitaja: hoplaa 2009-04-15 11:23:50
Tegin kaks tüüpilist sarnast tabelit, esimene int ja teine timestamp kuupäevaveergudega.

Ridu: 737572

Tabelid täitsin täiesti random andmetega, aga nii, et mõlemas tabelis on täpselt samad andmed.
Päringuid käivitasin 20 korda (*4b 5 korda).


CREATE TABLE `postitus_timestamp` (
`id` int(10) unsigned NOT NULL auto_increment,
`pealkiri` varchar(255) collate utf8_estonian_ci NOT NULL,
`sisu` text collate utf8_estonian_ci NOT NULL,
`staatus` tinyint(4) NOT NULL,
`lisatud` int(10) unsigned NOT NULL,
`muudetud` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `lisatud` (`lisatud`),
KEY `muudetud` (`muudetud`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci;

126.9 MB

CREATE TABLE `postitus_datetime` (
`id` int(10) unsigned NOT NULL auto_increment,
`pealkiri` varchar(255) collate utf8_estonian_ci NOT NULL,
`sisu` text collate utf8_estonian_ci NOT NULL,
`staatus` tinyint(4) NOT NULL,
`lisatud` datetime NOT NULL,
`muudetud` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `lisatud` (`lisatud`),
KEY `muudetud` (`muudetud`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci;


139.4 MB (+ 9%)


* 1.
SELECT SQL_NO_CACHE count(*) FROM postitus_timestamp WHERE lisatud BETWEEN 881745753 AND 1041538260
Matched rows: 55061

1,08396

SELECT SQL_NO_CACHE count(*) FROM postitus_datetime WHERE lisatud BETWEEN "1997-12-10 11:22:33" AND "2003-01-02 22:11:00"
Matched rows: 55061

1,27833 (+ 17%)

* 2.
SELECT SQL_NO_CACHE id, lisatud FROM postitus_timestamp WHERE lisatud BETWEEN 881745753 AND 1041538260 LIMIT 500
0,19814

SELECT SQL_NO_CACHE id, lisatud FROM postitus_datetime WHERE lisatud BETWEEN "1997-12-10 11:22:33" AND "2003-01-02 22:11:00" LIMIT 500
0,21741 (+ 10%)

SELECT SQL_NO_CACHE id, unix_timestamp(lisatud) FROM postitus_datetime WHERE lisatud BETWEEN "1997-12-10 11:22:33" AND "2003-01-02 22:11:00" LIMIT 500
0,22598 (+ 14%)

* 3
SELECT SQL_NO_CACHE id, lisatud FROM postitus_timestamp WHERE lisatud BETWEEN 881745753 AND 1041538260 ORDER BY lisatud LIMIT 100,100
0,05558 (+ 1%)

SELECT SQL_NO_CACHE id, lisatud FROM postitus_datetime WHERE lisatud BETWEEN "1997-12-10 11:22:33" AND "2003-01-02 22:11:00" ORDER BY lisatud LIMIT 100,100
0,05510

* 4
UPDATE postitus_timestamp SET lisatud=UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(lisatud), INTERVAL +1 MONTH)) LIMIT 10000
17,63668

* UPDATE postitus_datetime SET lisatud=DATE_ADD(lisatud, INTERVAL +1 MONTH) LIMIT 10000
18,30058 (+ 4%)

* 4b
UPDATE postitus_timestamp SET lisatud=UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(lisatud), INTERVAL +1 MONTH)) WHERE lisatud > 881745753 LIMIT 10000
76,02253
UPDATE postitus_datetime SET lisatud=DATE_ADD(lisatud, INTERVAL +1 MONTH) WHERE lisatud > "1997-12-10 11:22:33" LIMIT 10000
125,68858 (+ 65%) ***NB timestamp veerg muudetakse hetke ajaks***

* 5
SELECT SQL_NO_CACHE id FROM postitus_timestamp WHERE lisatud BETWEEN 881745753 AND 1041538260 AND (EXTRACT(HOUR FROM FROM_UNIXTIME(lisatud)) BETWEEN 8 AND 17) ORDER BY (EXTRACT(MINUTE FROM FROM_UNIXTIME(lisatud))) LIMIT 100
20,80619 (+ 25%)

SELECT SQL_NO_CACHE id FROM postitus_datetime WHERE lisatud BETWEEN "1997-12-10 11:22:33" AND "2003-01-02 22:11:00" AND (EXTRACT(HOUR FROM lisatud) BETWEEN 8 AND 17) ORDER BY (EXTRACT(MINUTE FROM lisatud)) LIMIT 100
16,66826


* 6
SELECT SQL_NO_CACHE id, lisatud FROM postitus_timestamp WHERE lisatud BETWEEN 1224968400 AND 1224990000 ORDER BY lisatud
197030 - 2008-10-26 03:37:01 - (1224981421)
448049 - 2008-10-26 03:43:06 - (1224981786)
231020 - 2008-10-26 03:06:40 - (1224983200)
87758 - 2008-10-26 03:12:43 - (1224983563)
724656 - 2008-10-26 03:39:27 - (1224985167)
694261 - 2008-10-26 03:59:12 - (1224986352)
461596 - 2008-10-26 04:37:23 - (1224988643)
****AJALISELT ÕIGE****


SELECT SQL_NO_CACHE id, lisatud FROM postitus_datetime WHERE lisatud BETWEEN "2008-10-26 00:00:00" AND "2008-10-26 05:00:00" ORDER BY lisatud
231020 - 2008-10-26 03:06:40
87758 - 2008-10-26 03:12:43
197030 - 2008-10-26 03:37:01
724656 - 2008-10-26 03:39:27
448049 - 2008-10-26 03:43:06
694261 - 2008-10-26 03:59:12
461596 - 2008-10-26 04:37:23
****AJALISELT VALE****


Märkida võiks seda, et baasist võetud unixi templit on lihtne date funktsiooniga sobivale kujule viia. Datetime puhul peab seda enne töötlema strtotime->date, ning kui baasi pole pandud gmdate, siis näitab valesid aegu kella keeramise ajal.
Tundub et kõiki mõnusaid kuupäeva funktsioone saab vabalt kasutada ka siis kui kastame int veerutüüpi, lihtsalt int tuleb enne läbi lasta FROM_UNIXTIME() funktsioonist, NB kiirusele nähtavat mõju ei avalda.

Int puhul, ei näe küll baasis surfates kohe ajatemplit, aga mind see eriliselt ei häiri.
Samas kui datetime puhul baasi panna gmdate, siis on kõik ajad nihkes ja katsu siis seda alati meeles pidada, ning et suvel on 2 tundi ja talvel 3 tundi vahe.

Timestamp veergu päringutega ei viitsinud testida, aga usun, et üsna sama tulemus tuleb, mis Int puhul.
Timestamp veeru tüübil on tore omadus, et kui rida muudetakse, siis ajatempliks läheb hetke aeg. Mure on selles, et enamasti suudetakse see ära unustada, ning veeru sisu muutub ka siis, kui me seda ei soovi.
Vaja update lausetes kasutada veerg=veerg.
Int puhul, kui vaja hetke aega sisestada, siis veerg=UNIX_TIMESTAMP(NOW()) või veerg='.time().'.


Kui keegi teab päringuid, mis int veerutüübi puhul võimatud või väga ressursinõudlikud on, siis palun andke teada, proovin järgi, saan targemaks.


Leheküljed: 1

©2002-2013 Martin Rebane & PHP.ee kaasautorid
  0.0955219268799