Dni i godziny - sumowanie

0

Witam. Mam parę pytań odnosnie czasu i dat w w SQL. Obecnie operuję programie MySQL Workbench. Już na wstepie chciałbym zaznaczyc, iż jestem nowicjuszem jeśli chodzi o SQL-a.

  1. Stworzyłem tabelę przedstawiającą czas pracy jednego pracownika w poszczególnych dniach.
create table Work_time(
id int primary key,
day_of_week varchar(20),
date_date date,
start time,
finish time); 

id day_of_week date_date start finish
1 monday 2014-07-07 0900 1700
... ... ... ... ...

Już przy tworzeniu tabeli, zastanawiałem się jaki ustawic format kolumny start i finish, aby potem można było łatwo zliczyc czas pracy np. w jednym dniu, bądź w całym miesiącu. Gdy użyłem float, nie wyswietlało mi godziny w odpowiednim formacie (hhss) czemu się nie dziwie, dlatego też zdecydowałem się na time. I w tym momencie dochodzimy do sedna sprawy. W jaki sposób można obliczyć czas pracy w jednym dniu, we wszystkie piątki lub zsumować go z całego miesiąca? Próbowałem robic to funkcją timestamp wzorując się na dokumentacji

 select timestamp (start,finish) from Work_time where id = 1;

, jednak nic z tego nie wyszło.
Proszę o pomoc

Udało mi się zrobic coś takiego.

select SUM(hour(finish-start)) as czas
from Work_time; 

Na ile jest to poprawne?

0

Po pierwsze w MySQL masz cały zestaw wbudowanych funkcji do operowania datą i czasem:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
Ciebie szczególnie powinna zainteresować funkcja DateDiff
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff
Moim zdaniem masz błąd w konstrukcji tabeli; do przechowywania początku i końca pracy nie używaj typu TIME (ponieważ on służy do reprezentacji czasu i jego maksymalna "pojemność" to 24h, a więc zadanie dłuższe niż 24h się tam po prostu nie zmieści...) tylko DATETIME (lub TIMESTAMP). po prostu zapisujesz start i koniec z pełną datą i czasem.
Potem możesz zrobić z tym co Ci się tylko żywnie podoba...
Możesz wyciągnąć sobie piątki za pomocą funkcji EXTRACT
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_extract

0

Bardzo dziękuję za odpowiedź. Dostosowałem się do powyzszych rad.
Mam jednak kolejne pytanie, nie zakładając kolejnego tematu, pozwolę sobie zadać je tutaj.
Moja tabela wygląda tak:

id week day_of_week start finish
1 1 poniedzialek 2013-08-21 0600 2013-08-21 1200
2 1 wtorek 2013-08-21 0600 2013-08-21 1400
...
Czy jest możliwość wyświetlania w outpucie widoku kolejno dodanych do siebie godzin tzn. powiedzmy, że pierwszego dnia czas pracy wyniósł 6h, wiec "za" finish byloby 6, we wtorek 7,5 wiec za finish gdzie id=2 byloby 13,5 itd. Myslałem, aby zrobić to w pętli, ale po zapoznaniu się z formułami pętli w mysql, nadal jestem w kropce.

0

Zapomnij o pętlach w SQL - to strasznie nieefektywne rozwiązanie i nie powinno się go stosować. SQL jest stworzony do przetwarzania zbiorów danych, a nie wiersz-po-wierszu.
Twoje zadanie jest banalne i wystarczy użyć dokumentacji i TimeStampDiff;

select id, week, day_of_week, start, finish, TIMESTAMPDIFF(second, start, finsih) / 3600.00 as WorkHours

I poważnie, dokumentacja jest pierwszym miejscem gdzie zaglądasz.
Nie forum.
PS. Jak coś nie zadziała, to kombinuj - ja niestety nie znam i nie chcę znać MySQL (bo to gówniana baza dnaych. Period.).
Nie mam go też pod ręką...

0

Dziękuję za odpowiedź, ale niestety nie działa tzn. w każdym wierszu 'workhours' wyswietla mi ilosc przepracowanych godzin w danym dniu, jednak nie sumuje tych godzin z góry do dołu. Wygląda to tak (to wiedziałem jak zrobić):

start finish workhours
8 16 8
6 16 10
9 19 10

a mi chodziło o to, aby wyglądało tak:

start finish workhours
8 16 8
6 16 18
9 19 28

Nie musisz mi wierzyc ale przejrzałem dokumentacje, poszukałem w google, jednak nie znalazłem odpowiedzi na moje pytanie, dlatego też przybyłem po pomoc na forum.

0

Chcesz mieć sumy narastająco?
Ale po co - będziesz tworzył z tego jakiś raport lub wyświetlał to gdziekolwiek?
Jeżeli tak, to wtedy najłatwiej zrobić to na kliencie...
Jeszcze jedno - podanie wartości przepracowanego czasu w godzinach uważam za lenistwo. Nikt tak nie podaje czasu, że coś trwa 2,125 h (czyli 0230), natomiast to dość powszechna praktyka. Ale tylko lenie tak robią ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1