Jump to content
php.lv forumi

Kā dabūt ierakstu no attiecīgā laika perioda?


briedis

Recommended Posts

Karoč, ir tabula ar datiem: datums, vērtība.

Datums nozīmē perioda sākumu

 

Kā atlasīt konkrēto vērtību, pēc kāda datuma, kas iekļauja periodā?

 

Piem,

Datums		   Vērtība
19.01.1929 11:44, 1
20.01.1929 11:58, 2
21.01.1929 12:18, 3
22.01.1929 12:51, 4
23.01.1929 13:43, 6

Piemēram, dots datums 20.01.1929 23:58, vajadzētu dabūt vērtību 2

Datums 22.01.1929 12:50, būtu jādabon 3.

Utt.

 

Iekš MySQL šitais..

Edited by briedis
Link to comment
Share on other sites

Visparastākais WHERE kverijs:

SELECT veertiiba FROM tabule WHERE AAA >= BBB LIMIT 1

 

Diemžēl dīvainā datuma formāta dēļ tev nāksies čakarēties ar AAA un BBB vērtībām. Kāpēc neizmanto parastu DATETIME vai TIMESTAMP kolonnas tipu?

Pēc būtības tev jāieraksta AAA vietā, piemēram, unix timestamps datuma kolonnai (ko vari dabūt ar mysql funkcijām) un BBB vietā ieliec meklētā datuma timestampu. Bet tas bremzēs, jo diez vai izmantos indeksus...

 

Ja tu glabātu datumus normālā datuma tipā, tad varētu WHERE daļā rakstīt vienkārši UNIX_TIMESTAMP(datuma_kolonna) >= UNIX_TIMESTAMP("1929.01.20 23:58:00").

Link to comment
Share on other sites

Hah, tik vienkārši! Paldies! Es jau biju aizdomājies līdz visādiem sarežģītiem risinājumiem...vot izrādās viss vienkāršākais ir pašā degungalā :)

 

Nu ir tā, ka tādā formātā tie dati vēl nav, ir mega liels txt fails, kuru caur php apstrādāšu un tad sadzīšu iekš tabulas, tākā tad arī pārformatēšu uz normālu datetime :)

Link to comment
Share on other sites

Visparastākais WHERE kverijs:

SELECT veertiiba FROM tabule WHERE AAA >= BBB LIMIT 1

 

Diemžēl dīvainā datuma formāta dēļ tev nāksies čakarēties ar AAA un BBB vērtībām. Kāpēc neizmanto parastu DATETIME vai TIMESTAMP kolonnas tipu?

Pēc būtības tev jāieraksta AAA vietā, piemēram, unix timestamps datuma kolonnai (ko vari dabūt ar mysql funkcijām) un BBB vietā ieliec meklētā datuma timestampu. Bet tas bremzēs, jo diez vai izmantos indeksus...

 

Ja tu glabātu datumus normālā datuma tipā, tad varētu WHERE daļā rakstīt vienkārši UNIX_TIMESTAMP(datuma_kolonna) >= UNIX_TIMESTAMP("1929.01.20 23:58:00").

Tas noteikti neizmantos indeksus, ja vien tas nav funkcijas indekss.

 

Ja pārsvarā darbosies ar SQL, labāk glabāt DATETIME. Es agrāk izmantoju INT lauku ar timestamp vērtību, bet tagad DATETIME kā natīvo formātu un, ja nepieciešams, timestampu izselektēju UNIX_TIMESTAMP (der izvadei ar PHP).

 

Un tas WHERE ir nepareizs pēc būtības, jo ja MySQL datus glabā DATETIME formātā, tad SQL izteiksmē viņu apstrādā, izmantojot MySQL date funkcijas, nevis pārveidojot uz UNIX_TIMESTAMP. MySQL datumu lieliski saprot, ja tas ir dots kā string atbilstoši formātam 'YYYY-MM-DD HH:MM:SS' vai 'YYYYMMDDHHMMSS. (dokumentācija)

 

Turklāt arī problēma ir aprakstīta neprecīzi - dots ir nevis datums, bet datums un laiks - tās ir divas dažādas lietas, nereti datumu un laiku pat glabā atsevišķos laukos.

 

Šajā gadījumā es saprotu, ka bija domāts atlasīt vienu vērtību, kas ir pirmā periodā, kas sākas ar doto datumu un laiku:

 

SELECT * WHERE datums < '2008-12-31 23:58' ORDER BY datums DESC LIMIT 1 ;

datuma lauka tips DATETIME ar indeksu.

Edited by Mr.Key
Link to comment
Share on other sites

  • 2 weeks later...

$sodien=date('d.m.20y');
		$q_seminari = "SELECT datums, id FROM $tb16 WHERE datums > '".$sodien."' ORDER BY datums Desc LIMIT 1";
		$r_seminari = mysql_query($q_seminari);
		$ro=mysql_fetch_assoc($r_seminari);
		echo $ro['datums'].'<br>';
		echo $sodien;

 

Viņš izvada, jocīgā kārtā pirmo, kas ir mazāks par šodienas datumu! :/....

Vajag pirmo lielāko, it kā tak viss ir kā vajag?

Groz to < kā gribu, bet vainu sanāk izvadīt pašu vecāko datumu vai vienu vecāku par šodiena...

Kas par vainu tur?

Edited by Artenis
Link to comment
Share on other sites

Tāpēc, ka tev lauks 'datums' ir varchar, un datumu tu glabā "nekārtojamā" formātā. (Mazākās vienības pirms lielākajām). Glabā datetime vai vienkārši kā TIMESTAMP'u (int). Pēc tam attēlojot varēsi pats noformatēt dd.mm.gggg formātā.

 

PS. "20y" ? :) Kāpēc ne vienkārši Y ?

Link to comment
Share on other sites

  • 3 weeks later...

karoč, mēģināju dabūt ārā to vērtību no konkrētā perioda, bet viņš paņem nākošo. Vajadzetu iepriekšējo;

 

Piem ir datu apgabals

11.03.1993|23:39|19|

13.03.1993|1:03|20|

14.03.1993|2:15|21|

15.03.1993|3:11|22|

16.03.1993|3:53|23|

 

Ievadu

$datums = "1993-3-14 2:00";

Kvērijs: SELECT * FROM tabula WHERE date >= '$datums' LIMIT 1

 

Viņš izdod ārā

Datums: 1993-03-14 02:15:00

Vērtībā: 21

 

Bet vajadzētu vērtību 20, jo

13.03.1993 1:03 20

14.03.1993 2:00

14.03.1993 2:15 21

..dotais datums ir pa vidu periodam...

 

Kā būtu pareizais kvērijs?

Link to comment
Share on other sites

Datubāzē nav tāda termina kā ierakstu secība. Ierakstu secību nosaka ORDER BY, viss pārējais, kas iegūts bez ORDER BY ir jāuzskata par laimīgu sagadīšanos (ja vien nav runa par rezultātu kopu, kas garantēti atgriež vienu un tikai vienu rezultātu (LIMIT neskaitās)).

Link to comment
Share on other sites

Datubāzē nav tāda termina kā ierakstu secība. Ierakstu secību nosaka ORDER BY, viss pārējais, kas iegūts bez ORDER BY ir jāuzskata par laimīgu sagadīšanos (ja vien nav runa par rezultātu kopu, kas garantēti atgriež vienu un tikai vienu rezultātu (LIMIT neskaitās)).

 

Ok, es iemetu ORDER BY date, bet nekas nemainās.

Link to comment
Share on other sites

×
×
  • Create New...