PDA

Pogčedajte punu verziju : 2 pitanja u vezi MySQL-a i PHP-a u vezi datuma


misko_
14. 06. 2008., 21:46
Cao,

Imam tablicu u MySQL-u kojo je jedan od podataka tipa date.
Kako da ja sada selektiram redak kojemu je taj datum najstariji.
Znaci ako imam 2 redka i jednome je datum 2008-12-25, a drugome je 2008-12-26, da se meni vrati redak od 2008-12-26.

Kako da mi se u PHP-u vrate svi datumi ižmeđu 2 datuma.
Npr. imam datum 2008-12-25 i 2008-12-27 ja bih želio da mi se vrati aray od
2008-12-26
2008-12-27
2008-12-28
Da li postoji neka gotova funkcija za to ?

HVALA

bluesman
14. 06. 2008., 22:39
Sa datumima mozes da radis kao sa stringovima

1. ... ORDER BY datum ASC
2. ... WHERE datum >= '2008-12-15' AND datum <= '2008-12-17' ORDER BY datim
ili koristi BETWEEN

ivanhoe
15. 06. 2008., 17:13
A mozes i max() i min() funkcije da koristis na datumima, to radi veoma brzo na indexiranim poljima (prakticno trenutno jer se ne radi upit, nego mysql to interno cuva za svaku tabelu) :

SELECT * FROM tabela WHERE datum=(SELECT MAX(datum) FROM tabela);

Ova forma je zgodna ako ne znas unapred koliko tih "najnovijih" rekorda imas, jer onda ne mozes da stavis LIMIT

jablan
15. 06. 2008., 18:26
Što se tiče dobijanja niza svih datuma između dva zadata, ne znam za PHP (naći će se neko već), ali u Rubiju ide ovako (sorry za showoff):

(d1..d2).to_a

:)

bluesman
15. 06. 2008., 18:35
vrlo citko i jasno

misko_
15. 06. 2008., 22:24
A mozes i max() i min() funkcije da koristis na datumima, to radi veoma brzo na indexiranim poljima (prakticno trenutno jer se ne radi upit, nego mysql to interno cuva za svaku tabelu) :

SELECT * FROM tabela WHERE datum=(SELECT MAX(datum) FROM tabela);

Ova forma je zgodna ako ne znas unapred koliko tih "najnovijih" rekorda imas, jer onda ne mozes da stavis LIMIT

Pronasao sam da sljedeci puti obavlja posao
$sql_query = "SELECT ID, TL_BROJ, UTVRDENA, PRIMJENJENA, ROW_ADD
FROM hnb_tecajna_lista
ORDER BY UTVRDENA DESC
LIMIT 1";
Zamjenim sa tvojim radi brzine...

misko_
15. 06. 2008., 22:27
Što se tiče dobijanja niza svih datuma između dva zadata, ne znam za PHP (naći će se neko već), ali u Rubiju ide ovako (sorry za showoff):

(d1..d2).to_a

:)

Evo ja sam traio po http://www.php.net/manual/en/refs.calendar.php
i koliko se meni čini takva funkcija uopće ne postoji u PHP-u, ili je ja nisam uspio pronaći.

Treba mi i da uporedim koji je od dva datuma veći, nešto tipa
if ($sadašnji_datum => datum_prijene)
i izgleda da PHP nema ništa ni za to, ma svašta...

zira
15. 06. 2008., 22:56
Za dobijanje niza svih datuma mozes koristiti ovako nesto:

http://boonedocks.net/mike/archives/137-Creating-a-Date-Range-Array-with-PHP.html

Inace, postoji range() funkcija u PHP, ali ne i za datume.

Sto se tice poredjenja datuma, ukoliko su u unix timestamp formatu ili MySQL formatu, radice bas to kako sti stavio, nista ti vise ne treba.

Ilija Studen
15. 06. 2008., 23:08
PHP podrška za rad sa datumom i vremenom je blagi užas. Tačnije - gotovo da je i nema. Za sve živo moraš sam da se dovijaš. Nije da je to neki ogorman problem kada naučiš par trikova, ali ne bi bilo loše da sam jezik dolazi sa ekstenzijom koja je tome posvećena.

cvele
16. 06. 2008., 13:57
Licno volim da belezim cist php time stamp, pa onda pomocu to_date fje da radim sta i kako mi treba. Sto se tice performansi nije bas najsrecnije, ali je veoma prakticno

misko_
16. 06. 2008., 22:00
Evo koda sa kojim sam ovo za datme rijesio mozda netkome zatreba.

<?php

class MySQL_date
{
// site::http://boonedocks.net/mike/archives/137-Creating-a-Date-Range-Array-with-PHP.html
public static function createDateRangeArray($strDateFrom, $strDateTo)
{
// takes two dates formatted as YYYY-MM-DD and creates an
// inclusive array of the dates between the from and to dates.

// could test validity of dates here but I'm already doing
// that in the main script

$aryRange=array();

$iDateFrom=mktime(1,0,0,substr($strDateFrom,5,2), substr($strDateFrom,8,2),substr($strDateFrom,0,4)) ;
$iDateTo=mktime(1,0,0,substr($strDateTo,5,2), substr($strDateTo,8,2),substr($strDateTo,0,4));

if ($iDateTo>=$iDateFrom) {
array_push($aryRange,date('Y-m-d',$iDateFrom)); // first entry

while ($iDateFrom<$iDateTo) {
$iDateFrom+=86400; // add 24 hours
array_push($aryRange,date('Y-m-d',$iDateFrom));
}
}

return $aryRange;
}

// convert string in format dd.mm.YYYY to MySQL format http://dev.mysql.com/doc/refman/5.0/en/datetime.html YYYY-MM-DD
// example 18.04.2008 to 2008-04-18
public static function ddmmYYYYtoYYYYMMDD($date)
{
$parts = explode(".", $date);

$new_date = $parts[2] . '-' . $parts[1] . '-' . $parts[0];

return $new_date;
}

}

?>

cvele
16. 06. 2008., 22:03
samo jedno offtopic pitanje, sto insistirati na klasama ako su sastavljene samo od static funkcija ? jedino organizacije radi... ali to mi nekako nije dovoljno dobar razlog

bluesman
16. 06. 2008., 23:08
pogledaj funkcije strototime(), malo je čitljivije sa tim

function createDateRangeArray($strDateFrom, $strDateTo)
{
$aryRange = array();
while ($strDateFrom <= $strDateTo)
{
$aryRange[] = $strDateFrom;
$strDateFrom = date("Y-m-d", strtotime ("+1 day", strtotime($strDateFrom)));
}
return $aryRange;
}A mislim da ti je lakse i sa explode("-", $date) nego onoliki substr()...

misko_
17. 06. 2008., 07:20
samo jedno offtopic pitanje, sto insistirati na klasama ako su sastavljene samo od static funkcija ? jedino organizacije radi... ali to mi nekako nije dovoljno dobar razlog

"samo" radi organizacije, ali to sa sobom povlaći još par stvari:

1. Ako mi je napravljeno kao klasa, mogu napisati unit test
2. Ako imam unit test, onda mogu lako optimizirati kod bez pretjeranoga straha da cu nesto zeznuti, npr. mogu lako zamjeniti kod fukcije sa ovim što je bluesman napisao i vidjeti da li je sve ok bez da sada moram gledati kao jedna i kako druga funkcija rade...
3. Ako bih imao faj sa funkcijama, postoji mogućnost da ukljućim neki drugi faj koji ima fukcije koje se isto zovu, pa eto opet problema...

Mislim da su ovo uglavnom svi razlozi(bar kojih se trenutno mogu sketiti)...

Da li je to najbolja praksa, pa iskreno nezam, ali mi se zada čini bolja od alternative...

cvele
17. 06. 2008., 08:54
da me ne shvatis pogresno, nisam rekao da je to nesto specijalno lose niti specijalno dobro... samo me je zanimalo.

Kad smo kod toga koliko vas jos koristi unit testing ?

misko_
17. 06. 2008., 09:45
da me ne shvatis pogresno, nisam rekao da je to nesto specijalno lose niti specijalno dobro... samo me je zanimalo.

Kad smo kod toga koliko vas jos koristi unit testing ?

...nema problema...

...unit testing -> ja gledam da koristim, kada imam funkciju za koju kužim kako da napišem test, ali ne mogu reći da sam unit test developer, možda jednog dana...

ivanhoe
17. 06. 2008., 18:04
ja preferiram da mi samo baza pravi timestampove, a vadim ih pomocu UNIX_TIMESTAMP(). Tako sam siguran da su svi timestampovi kreirani po istom satu i u istoj vremenskoj zoni, za slucaj da se php vrti na drugoj masini od baze (ili na vise masina za neki load balancing)