Jump to content
php.lv forumi

regulārā izteiksme datumā


tamtaram

Recommended Posts

datubāzītē man laiciņš stāv šitā '2007-02-20 18:05:19'

 

pirmais: kā man šito formātu saskaldīt atsevišķi pa gadiem, mēnešiem un datumiem, laiks nav svarīgs.

otrais: kā pieprasīt vēlamo gadu, mēnesi vai datumu, tā lai viņš izmestu visus attiecīgos tā gada mēneša vai datuma ierakstus.

 

traki ar tām izteiksmēm iet, nezinu kurā pusē burties. vienīgais ko esmu uztaisījis ir primitīva teksta izvilkšana 'preg_match('([0-9]/*[0-9]*)', $var, $res);'

Link to comment
Share on other sites

Nu nav jau obligāti ar regulārajām ekspresijām uzreiz jāņemas..

 

Ja datubāzīte ir MySQL var izmantot DATE_FORMAT http://dev.mysql.com/doc/refman/4.1/en/dat...-functions.html

SELECT DATE_FORMAT(datuma_lauks,'%Y') AS gads, DATE_FORMAT(datuma_lauks,%m) AS menesis, DATE_FORMAT(datuma_lauks,%d) AS diena

 

to pashu var izdarīt arī ar php un date() funkciju http://lv.php.net/date $gads = date("Y",strtotime('2007-02-20 18:05:19')); utt..

 

 

Kas attiecas uz atlasīšanu tad MySQLam idejiski var prasiit WHERE datuma_lauks LIKE '2007-%' vai datuma_lauks LIKE '2007-01-%' ..

 

No ātrdarbības viedokļa tas gan nav baigi fiksi. Līdz ar to pie lielākiem apjomiem datus nepieciešams dalīt un indeksēt.. bet tas atkarīgs ko un kā lieto.

 

update:

faktiski ar php var izmantot getdate() http://lv.php.net/manual/en/function.getdate.php

dabūsi apakaļ uzreiz visu datumu sadalītu pa gabaliem un vēl šādu tādu info..

Link to comment
Share on other sites

nu tā, savākšanai es beigās nolēmu izmantot getdate() un atlasīšanai Rozes variantu, bet izskatās, ka variētākai atlasīšanai ņemšu bubu piemēru. paldies jums.

 

offtopikā atgriežos pie iepriekšējiem postiem par rekursiju, starp lietotāju kokiem un viņu savstarpēju punktu skaitīšanu.

pašreizējā situācijā pats augšējais parents zem sevis tur ~2000 bērnu (pārējiem lielākajiem parentiem aptuveni ~50), un šī parenta koka attēlošana aizņem diezgan pailgu laiku, kādas 15-20 sekundes viņš moca mysql'u.

kā panākt ātrdarbīgāku šī koka attlēlošanu, jo lietotāju skaits aug. principā pārsvarā viss kas mainās tie ir punkti. man taisīt kešu un pārbaudīt vai bāzē ir punktu izmaiņas pirms ielādēt tabulu katru reizi no jauna vai taisīt kaut kādu laika ierobežojumu atļaujai ielādēt jaunākās izmaiņas?

Link to comment
Share on other sites

andrisp --> nafig izmantot PHP ja ir

UNIX_TIMESTAMP( datuminsh)

---------

Datuma salidzinaashanai etc: ir

DATE( datuminsh )

 

ja vajag lai iekljautu gan sakuma dienu gan beigu datumu tad...

 

SELECT * FROM tabulis WHERE date( datuminsh ) > DATE_ADD( '2000-10-10', INTERVAL -1DAY ) AND date( datuminsh ) < DATE_ADD( '1900-11-11', INTERVAL 1 DAY)

 

shadi buus gan aatraak gan preciizaak...

Un izmantojiet Tachu MySql piedaavaataas iespeejas... (un to ir LJOTI daudz...)

Roze iedeva preciizu linku paskataties tachu ....

Edited by Grey_Wolf
Link to comment
Share on other sites

bez tiem date_add tad laikam date( datuminsh ) <= '2000-10-09' AND date( datuminsh ) >= '1900-11-12' būs

 

bet imho tomēr labāk ir php pusē izrēķināt no kura līdz kuram datumam tad tev īsti vajag (db tāpat ir daudz ko darīt, nevajag viņai uzkraut vēl datumu pārrēķināšanu tikai tāpēc, ka mysql ir daudz f-jas datumiem)

Link to comment
Share on other sites

jā jā, select * from table1, table2, .. tableN, visu sessijā un tad lasam ārā ko vajag! :)

 

takš ne tā un ne tādā gadījumā, domāts bija ka ar php sarēķinam intervālus kuros meklēt, jo

čupai ierakstu ar datumiem izmalt cauri salīdzināšanu un datumu f-jas būs lenāk nekā taij pašai čupai ierakstu izmalt cauri tikai salīdzināšanu, vienalga cik gudri un viltīgi db datumu f-jas apstrādās.

Link to comment
Share on other sites

visa matemātika pavisam vienkārša, šito nelaimīgo kveriju

SELECT * FROM tabulis WHERE date( datuminsh ) > DATE_ADD( '2000-10-10', INTERVAL -1DAY ) AND date( datuminsh ) < DATE_ADD( '1900-11-11', INTERVAL 1 DAY)

 

var arī šitā rakstīt, ja datuminsh lauks ir date* tipa

$sql = 'SELECT * FROM tabulis WHERE datuminsh > \''.date(...).'\'  AND  datuminsh < \''.date(...).'\''

vai ja datuminsh lauks ir unixtimestamps

$sql = 'SELECT * FROM tabulis WHERE datuminsh > '.strtotime(...).'  AND  datuminsh < '.strtotime(...)

 

imho tā db būs vieglāk viņu izpildīt.

Edited by v3rb0
Link to comment
Share on other sites

×
×
  • Create New...