PDA

Visualizza la versione completa : Come Calcolare Le Ore Totali???


angelomorto
16-12-2008, 11:50
Ho una tabella così creata....



CREATE TABLE IF NOT EXISTS `permessi` (
`id` int(10) unsigned NOT NULL auto_increment,
`nome` varchar(255) collate utf8_unicode_ci NOT NULL default '',
`data_da` date NOT NULL default '0000-00-00',
`ora_da` time NOT NULL default '00:00:00',
`data_a` date NOT NULL default '0000-00-00',
`ora_a` time NOT NULL default '00:00:00',
`descrizione` varchar(255) collate utf8_unicode_ci default NULL,
`malattia` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `badge` (`nome`)
) ENGINE=MyISAM


in cui salvo le ore di permesso o di ferie...ad esempio supponiamo che Pippo prende dei giorni di permesso dal 17/12/2008 dalle ore 9:00 al 18/12/2008 ore 13.00 ...quindi rientrerebbe in ufficio alle 14.00 dopo la pausa pranzo del 18 ....

Ora il mio problema è calcolare le ore di permesso il quale sarebbero 8 ore del giorno 17 + 4 ore del giorno 18 quindi in tutto ha preso 12 ore di permesso....

Esiste un modo per fare questo calcolo direttamente in SQL??? O magari uno script in PHP???

Emulman
16-12-2008, 12:04
invece che usare campi distinti per data e ora , usa un campo DATETIME così hai assieme data e ora, tipo

12-16-2008 11:00:56

chiamale DATA_DA e DATA_A poi ci puoi usare l'istruzione MySQL DATEDIFF per calcolare le differenze fra due date con la query seguente:

SELECT DATEDIFF(data_da, data_a) AS diff

ti restituirà la differenza fra le due date in giorni e ore

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

angelomorto
16-12-2008, 12:14
Originariamente inviato da Emulman
invece che usare campi distinti per data e ora , usa un campo DATETIME così hai assieme data e ora, tipo

12-16-2008 11:00:56

chiamale DATA_DA e DATA_A poi ci puoi usare l'istruzione MySQL DATEDIFF per calcolare le differenze fra due date con la query seguente:

SELECT DATEDIFF(data_da, data_a) AS diff

ti restituirà la differenza fra le due date in giorni e ore

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

sì ma il problema è che lui ti fa il calcolo sulle 24 ore e non sulle 8 ore lavorative!!! :master:

Emulman
16-12-2008, 12:49
vero...quindi penso che bisogna distinguere i casi e fare degli if.

Se giorno_da e giorno_a coincidono allora basta fare solo un DATEDIFF; ma se data_a è maggiore di data_da allora occorre fare un altro calcolo. quindi, in PHP (supponendo che mantieni nello stesso campo data e ora):



// preleva la data
if (substr($data_da, 0, 10) == substr($data_a, 0, 10))
$query = "SELECT DATEDIFF('".substr($data_a, 0, 10)."', '".substr($data_da, 0, 10)."') AS diff";
else {
// questa query calcola quante ore mancano alla fine dell'orario di lavoro giornaliero
// supponendo che si finsica di alvorare alle 17
$query = "SELECT DATEDIFF('".substr($data_da, 0, 10)." 17:00:00', '".$data_da."') AS primaDiff";
// esegui la query e avrai il risultato nella variabile, ad esempio, $primaDiff
// ora esegui la seconda query, che calcola la differenza in ore fra l'orario di entrata e l'inizio del lavoro alle 9
$query = "SELECT DATEDIFF('2008-12-17 ".substr($data_a, 11)."', '2008-12-17 09:00:00') AS secondaDiff";
// esegui la query e avrai il risultato nella variabile, ad esempio, $secondaDiff
// sottrae le due variabili epr avere le ore e i minuti
$query = "SELECT SUBTIME($secondaDiff, $primaDiff) AS diff";
// esegui la query e avrai il risultato nella variabile, ad esempio, $diff
}


più o meno penso dovrebeb bastare..mi auguro!!!

Loading