Autor Zpráva
valecekm
Profil
Zdravím Vás a prosím o radu.
Pokoušel jsem se z databáze vytahnout data podle datumu OD/DO pomocí BETWEEN(nepomohli ani klasické operátory jako =< a =>..ale to až dále) a sám nevím kde je vlastně chyba. Omlouvám se za dlouhé zdrojové kódy, ale bez nich by problém byl pravděpodobně nepochopitelný.

SQL pro přípravu dat:
-- 
-- Struktura tabulky `zaznamy_poruch`
-- 

CREATE TABLE `zaznamy_poruch` (
  `ID_number` bigint(20) NOT NULL auto_increment,
  `datum` datetime NOT NULL,
  `problem` longtext NOT NULL,
  PRIMARY KEY  (`ID_number`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=23 ;

-- 
-- Vypisuji data pro tabulku `zaznamy_poruch`
-- 

INSERT INTO `zaznamy_poruch` VALUES (21, '2011-09-05 00:00:00', 'Ulomeni panelu');
INSERT INTO `zaznamy_poruch` VALUES (20, '2011-09-04 00:00:00', 'Skrat');
INSERT INTO `zaznamy_poruch` VALUES (19, '2011-09-03 00:00:00', 'Roztaveni');
INSERT INTO `zaznamy_poruch` VALUES (18, '2011-09-02 00:00:00', 'Rozsahla havarie');
INSERT INTO `zaznamy_poruch` VALUES (17, '2011-09-01 00:00:00', 'Skrat');
INSERT INTO `zaznamy_poruch` VALUES (16, '2011-08-16 00:00:00', 'Prehrati');
INSERT INTO `zaznamy_poruch` VALUES (15, '2011-08-15 00:00:00', 'Skrat');
INSERT INTO `zaznamy_poruch` VALUES (14, '2011-08-14 10:06:20', 'Prehrati');
INSERT INTO `zaznamy_poruch` VALUES (13, '2011-08-13 10:06:20', 'Spatne chlazeni');
INSERT INTO `zaznamy_poruch` VALUES (12, '2011-08-12 10:06:20', 'Skrat');
INSERT INTO `zaznamy_poruch` VALUES (11, '2011-08-11 10:06:20', 'Prehrati');
INSERT INTO `zaznamy_poruch` VALUES (10, '2011-08-10 10:06:20', 'Ulomeni panelu');
INSERT INTO `zaznamy_poruch` VALUES (9, '2011-08-09 10:06:20', 'Prehrati');
INSERT INTO `zaznamy_poruch` VALUES (8, '2011-08-08 10:06:20', 'Skrat');
INSERT INTO `zaznamy_poruch` VALUES (7, '2011-08-07 10:06:20', 'Spatne chlazeni');
INSERT INTO `zaznamy_poruch` VALUES (6, '2011-07-06 10:06:20', 'Prehrati');
INSERT INTO `zaznamy_poruch` VALUES (5, '2011-07-05 10:06:20', 'Skrat');
INSERT INTO `zaznamy_poruch` VALUES (4, '2011-07-04 10:06:20', 'Prehrati');
INSERT INTO `zaznamy_poruch` VALUES (3, '2011-07-03 10:06:20', 'Rozsahla havarie');
INSERT INTO `zaznamy_poruch` VALUES (2, '2011-07-02 10:06:20', 'P?eh?átí');
INSERT INTO `zaznamy_poruch` VALUES (1, '2011-07-01 10:06:20', 'P?eh?átí');


PHP skript ukaz.php:
<?php
Header ("Pragma: no-cache");
Header ("Cache-Control: no-cache");
Header ("Expires: ".GMDate("D, d M Y H:i:s")."GTM");

require "config.php"; // pripoji k DB
//-------------------------------------------------------------------------
// byl odeslan dotaz pro vypsani poruch
if (isset($_GET['from_date']) and isset($_GET['to_date'])) {
    $datum_od = strip_tags(trim($_GET['from_date']));
    $datum_do = strip_tags(trim($_GET['to_date']));
echo "<table>
<tr><td>Datum a čas</td><td>Porucha</td></tr>";    
Vypis_data_Poruchy($datum_od, $datum_do);
echo "</table>";
}

function Vypis_data_Poruchy($datum_od, $datum_do){
    
$query_2 = mysql_query("SELECT `ID_number`, DATE_FORMAT(`datum`, '%d. %m. %Y %H:%i:%s') AS `up_datum`, `problem` FROM `zaznamy_poruch` WHERE(`datum` BETWEEN (DATE_FORMAT('".$datum_od."', '%Y-%m-%d %H:%i:%s')) AND (DATE_FORMAT('".$datum_do."', '%Y-%m-%d %H:%i:%s'))) ORDER BY `datum` ASC") or die("Nepodařilo se zpracovat SQL dotaz");  
 while($q_projdi = MySQL_Fetch_Array($query_2)):
echo "<tr><td>".$q_projdi['up_datum']."</td><td>".$q_projdi['problem']."</td></tr>";       	      
endwhile;
}
?> 


Pokud zažádám o data v měsíci srpnu do 15.8.: http://localhost/projectx/ukaz.php?from_date=2011-08-7&to_date=2011-08-15, tak vše vpohodě, ale jakmile zažádám už jen o den méně na 14.8. http://localhost/projectx/ukaz.php?from_date=2011-08-7&to_date=2011-08-14 , tak se mi data vypíšou o den MÉNĚ a tudíž jen do 13.8. Prostě se o jeden den ubere. Pravděpodobně bude problém někde v porovnávání datumu v tabulce DATUM a problém se bude odrážet od uvedeného času 00:00:00 a jiných, ale nechápu proč? Jednou je to prostě datum a čas jako každej jinej snad a tak by to mělo aspoň podle logického uvážení fungovat.....?

Prosím zkušené i nezkušené, kteří rádi koumají o vysvětlení a radu po snad 2hodinovém bezvýsledném pátráním čím to je....doufám, že to nebude nějaká velká začátečnická chyba, jinak bych se sám asi nakopal ;-). Předem děkuji za každou radu.
motik
Profil
valecekm:
nějak moc jsem to nestudoval, ale rozdělil bych datum a čas (stejnak vyhledáváš podle datumu)... nejspíš bude chyba někde ve formátech toho datumu
valecekm
Profil
motik:
No někde tam něco vrtat bude, ale otázka je co? J je to možnost jak jste napsal rozdělit datum a čas, ale u DB, která ma několik GB takto upravovat tabulky je aspoň pro mne celkem odvážnej krok. Jinak ale děkuji.

Pánové, kluci, dámy.... nebyl by tu někdo kdo by viděl to problematiky datovejch typů v MySQL a zkusil odhadnout čím by to mohlo být?

Úprava příspěvku:
No kvůli tlaku a času, jsem se musel uchýlit k rozdělení datumu a času zvlášť do jiných tabulek, aspoň na zkušební ukázce jak napsal motik, ale nevím jak se to bude řešit v ostrém provozu s GB dat. Proto toto vlákno nechávám otevřené a kdyby někdo věděl a chtěl pomoct, tak budu jen rád.
DJ Miky
Profil
2011-08-15 se do data a času převede jako 2011-08-15 00:00:00, tedy vybrané záznamy budou končit o půlnoci předchozího dne, ne ve 23:59:59 zadaného dne.

Buď porovnávej jenom data:
... WHERE DATE(datum) BETWEEN "2011-09-07" AND "2011-09-08"


Nebo za datum konce připoj 23:59:59 a bude to fungovat podle představ:
SELECT datum FROM testdata
2011-09-08 00:00:01
2011-09-08 00:00:00
2011-09-07 23:59:59

SELECT datum FROM testdata WHERE datum BETWEEN "2011-09-07" AND "2011-09-08"
2011-09-08 00:00:00
2011-09-07 23:59:59

SELECT datum FROM testdata WHERE datum BETWEEN "2011-09-07 00:00:00" AND "2011-09-08 23:59:59"
2011-09-08 00:00:01
2011-09-08 00:00:00
2011-09-07 23:59:59
valecekm
Profil
DJ Miky:
2011-08-15 se do data a času převede jako 2011-08-15 00:00:00, tedy vybrané záznamy budou končit o půlnoci předchozího dne, ne ve 23:59:59 zadaného dne.

Díky moc ;-)! To je ono co jsem potřeboval vědět, jak se to chová, ještě jednou moc dík ;-).
Toto téma je uzamčeno. Odpověď nelze zaslat.

0