briedis Posted July 27, 2008 Report Share Posted July 27, 2008 (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 July 27, 2008 by briedis Link to comment Share on other sites More sharing options...
bubu Posted July 27, 2008 Report Share Posted July 27, 2008 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 More sharing options...
briedis Posted July 27, 2008 Author Report Share Posted July 27, 2008 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 More sharing options...
Mr.Key Posted July 30, 2008 Report Share Posted July 30, 2008 (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 July 30, 2008 by Mr.Key Link to comment Share on other sites More sharing options...
bubu Posted July 30, 2008 Report Share Posted July 30, 2008 Uff, pareizi. ORDER BY aizmirsu. To arī tur vajag. Link to comment Share on other sites More sharing options...
Artenis Posted August 8, 2008 Report Share Posted August 8, 2008 (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 August 8, 2008 by Artenis Link to comment Share on other sites More sharing options...
andrisp Posted August 8, 2008 Report Share Posted August 8, 2008 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 More sharing options...
Artenis Posted August 8, 2008 Report Share Posted August 8, 2008 Sanāca vienkārši pārliekot no varchar uz date! ;) 20y tādēļ, ka tas likāš pietiekoši labs variants! :) Link to comment Share on other sites More sharing options...
briedis Posted August 25, 2008 Author Report Share Posted August 25, 2008 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 More sharing options...
Aleksejs Posted August 25, 2008 Report Share Posted August 25, 2008 Pareizais būtu ar ORDER BY date, time Link to comment Share on other sites More sharing options...
briedis Posted August 25, 2008 Author Report Share Posted August 25, 2008 Pareizais būtu ar ORDER BY date, time Bet datumi jau ir augošā secībā.. kāda jēga tad no Order? Link to comment Share on other sites More sharing options...
Aleksejs Posted August 25, 2008 Report Share Posted August 25, 2008 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 More sharing options...
briedis Posted August 25, 2008 Author Report Share Posted August 25, 2008 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 More sharing options...
Aleksejs Posted August 25, 2008 Report Share Posted August 25, 2008 Est teicu: ORDER BY date, time nevis ORDER BY date Link to comment Share on other sites More sharing options...
briedis Posted August 25, 2008 Author Report Share Posted August 25, 2008 Est teicu:ORDER BY date, time nevis ORDER BY date paga, es nesapratu? kas ir date,time? Kolonna, datutips? Link to comment Share on other sites More sharing options...
Recommended Posts