webForumDet fria alternativet

Tidrapport, summera timmar och minuter

PHP

11 svar · 968 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Hej,

Har ett tidrapporteringssystem och har nu ett problem.
Såhär ställer jag upp datum och tid:

Datum		Börjat	Slutat	Total
-------------------------------------
2009-08-23	08:00	09:00	01:00
2009-08-24	08:00	10:30	02:30
2009-08-25	13:00	14:00	01:00
2009-08-26	08:00	09:45	01:45
-------------------------------------
[B]Totalt				05:45[/B]

Alla tider sparas som UNIX_TIMESTAMP() i databasen. Nu har jag problem med att beräkna Totalt, har försökt på lite olika sätt, men får inte alls till det, jag rör bara ihop det i huvudet.

Så, har någon en bra lösning på det här?

Tack!

Medlem sedan mars 20007 896 inlägg
#2
select
    sum(
        subtime(slutat, börjat)
    ) as totalt
from
    tidrapport
where
    user='SPiN'
Medlem sedan feb. 20034 441 inlägg
#3

Hmm, tot_hours blir alltid 0, vad kan det bero på? Hur skulle SQL frågan se ut om jag vill ha ut både "radtotal" och "total" direkt i SQL frågan?

$query= "SELECT "
		."a.list_id, a.list_name, a.list_closed, "
		."b.part_id, b.part_start, b.part_end, b.part_desc, "
		."(SELECT SUM(SUBTIME(part_end, part_start)) FROM timereport_part WHERE part_parent = a.list_id) AS tot_hours "
		."FROM timereport_list a "
		."LEFT OUTER "
		."JOIN "
		."timereport_part b "
		."ON a.list_id = b.part_parent "
		."WHERE a.list_id = " . $list_id . " "
		."ORDER BY b.part_id ASC";
Medlem sedan feb. 20034 441 inlägg
#4

Har kört bl.a. den här direkt mot databasen:

SELECT
SUM(SUBTIME(FROM_UNIXTIME(part_end, '%Y-%m-%d %H:%i'), FROM_UNIXTIME(part_start, '%Y-%m-%d %H:%i'))) AS total
FROM timereport_part
WHERE part_parent = 1

Men får alltid 0 eller NULL som resultat. Vad kan det bero på?

Medlem sedan feb. 20034 441 inlägg
#5

Mkt konstigt.. även det här returnerar NULL:

SELECT SUM( SUBTIME( '2009-08-23 22:40', '2009-08-23 21:10' ) )
FROM timereport_part
WHERE part_parent = 1
Medlem sedan feb. 20034 441 inlägg
#6

Har gjort ytterligare testar nu:

SELECT FROM_UNIXTIME(part_start), FROM_UNIXTIME(part_end), SUBTIME(part_end, part_start) AS DIFF FROM timereport_part WHERE part_parent = 1

Ger:

[b]FROM_UNIXTIME(part_start) 	FROM_UNIXTIME(part_end) 	DIFF[/b]
2008-12-06 09:30:00 		2008-12-06 13:30:00 		NULL
2008-12-07 09:30:00 		2008-12-07 16:00:00 		NULL
2008-12-12 11:00:00 		2008-12-12 12:00:00 		NULL
2008-12-12 12:30:00 		2008-12-12 14:00:00 		NULL
2008-12-15 20:00:00 		2008-12-15 21:00:00 		NULL
2009-01-24 19:00:00 		2009-01-24 21:00:00 		NULL
2009-01-25 14:00:00 		2009-01-25 15:00:00 		NULL
2009-01-25 15:00:00 		2009-01-25 19:00:00 		NULL
2009-01-26 20:00:00 		2009-01-26 22:00:00 		NULL
2009-02-08 17:30:00 		2009-02-08 20:30:00 		00:00:00
2009-02-10 20:00:00 		2009-02-10 23:00:00 		00:00:00
2009-02-11 21:30:00 		2009-02-11 23:30:00 		00:00:00
2009-02-14 12:00:00 		2009-02-14 17:00:00 		NULL

Varför ger vissa NULL och andra 00:00:00?

Medlem sedan mars 20007 896 inlägg
#7

Använder du MySQL? Det finns, om jag kan läsa manualen rätt, ingen datatyp som heter unix_timestamp? Är det enbart datatypen timestamp du menar, möjligtvis?

Nytt försök med date_format();

select
    sum(
        subtime(
            date_format(part_end, '%H:%i'),
            date_format(part_start, '%H:%i')
        )
    ) as total
from
    tabell
Medlem sedan feb. 20034 441 inlägg
#8

SPiN skrev:

Använder du MySQL? Det finns, om jag kan läsa manualen rätt, ingen datatyp som heter unix_timestamp? Är det enbart datatypen timestamp du menar, möjligtvis?

Ledsen om jag var otydlig, datatypen är INT och det som sparas är värdet av time(), skapat med hjälp av MKTIME.

Kollar på ditt exempel snart.

Tack!

Medlem sedan mars 20007 896 inlägg
#9

Det kommer inte att fungera, så det är ingen idé. ;)

Prova istället följande:

select
    sum(
        time_to_sec(
            date_format(from_unixtime(slutade), '%Y-%m-%d %H:%i')
        ) - time_to_sec(
            date_format(from_unixtime(började), '%Y-%m-%d %H:%i')
        )
    ) / 3600 as totalt /* det går 3600 sek/h */
from
    tabell
Medlem sedan feb. 20034 441 inlägg
#10

Nuså!

Men, om jag vill visa resultatet som HH:mm, hur ska jag göra då? Nu får jag ut rätt antal timmar i decimalform, t.ex. när antalet timmar är 51 så får jag ut 50.7500.

Nu kan jag ju göra t.ex. ceil i PHP för att få 51, men jag vill ha ut antal minuter också.

Tack!

Medlem sedan mars 20007 896 inlägg
#11

Det blir många nästlade funktioner ;)

select
    sec_to_time(
        sum(
            time_to_sec(
                date_format(from_unixtime(slutade), '%Y-%m-%d %H:%i')
            ) - time_to_sec(
                date_format(from_unixtime(började), '%Y-%m-%d %H:%i')
            )
        )
    ) as total
from
    tabell
Medlem sedan feb. 20034 441 inlägg
#12

Japp!
Tack ska du ha!

262 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)