Jump to content
php.lv forumi

Recommended Posts

Posted (edited)

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
Posted

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").

Posted

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 :)

Posted (edited)
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
  • 2 weeks later...
Posted (edited)

$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
Posted

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 ?

  • 3 weeks later...
Posted

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?

Posted

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)).

Posted
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.

×
×
  • Create New...