Gruplayarak saat farkı hesabı

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Gruplayarak saat farkı hesabı

Mesaj gönderen gkimirti »

olayı su sekilde izah etmeye calısayım
bas_saat ve bit_saat isimli iki TIME alanım var

tabloda baska bir alana gore gruplama yaparak ben bu saatler arasındaki farkın toplamını istiyorum
yani
select teknisyen,sum(saatfarkı) from servis
group by teknisyen

saatfarkı diye bir procedure yazdım lakin cozum olmadı
group kullanmadan farkı hesaplatabiliyorum.
select teknisyen,(select donen from saatfarki(bas_saat,bit_saat)) from servis

simdi grouplayarak nasıl bu islemi yapacagım.

baska bir alternatif Computed Field kullanmak ama saatfarkı islemi
bit_saat-bas_saat seklinde basit bir sey degil

22:00 de baslayıp 01:00 de biten servis aslında 3:00 surmustur
bunu eger mumkunse Computed By ile nasıl yapabilirim (pek mumkun degil gibi ama...)
ÜŞENME,ERTELEME,VAZGEÇME
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Firebird için;

Kod: Tümünü seç

select teknisyen_id,sum(case when endtime < starttime then endtime - starttime + 86400 else endtime - starttime end) from teknisyen group by teknisyen_id
Buradan dönen değer saniye cinsinden gelecektir. Muhtemelen delphi içinde düzgün dönüştürülür gelen sonuç.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
onaydin

Mesaj gönderen onaydin »

Kod: Tümünü seç

sum(BIT_SAAT - BAS_SAAT)/3600 from SERVIS group by TEKNISYEN

o tablodaki personelin toplam saat farkını veriyor.
Gün bazında alınacaksa group by a tarih eklemeli.
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,
onaydin yazdı:

Kod: Tümünü seç

sum(BIT_SAAT - BAS_SAAT)/3600 from SERVIS group by TEKNISYEN

o tablodaki personelin toplam saat farkını veriyor.
Gün bazında alınacaksa group by a tarih eklemeli.
Verdiğiniz kodda şayet BIT_SAAT 01:00:00 BAS_SAAT:23:00 olursa çalışan kişinin 23 saat çalıştığı sonucu çıkacaktır. Logic bir hata olduğundan farkedilmesi için birilerinin gece çalışıp bu durumu oluşturması gerekir. Mesai saatleri 08-17 olan bir yerde bu sorun oluşmazken gece vardiyası olan bir yerde sorun çıkacaktır.

Kolay gelsin,
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
onaydin

Mesaj gönderen onaydin »

Haklısınız. Cevaplamak için girdiğimde sizin mesajınız yoktu
o esnada yazmışsınız. Kod içinde küsüratlarda 360 a bölünce doğru bir sonuç vermiyor.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

en saglam yol donus degeri time olan bir dll fonksiyonu hazırlamak
ama su sekilde de is goruyor.

Kod: Tümünü seç

CAST(SUM(CASE WHEN X.BIT_SAAT < X.BAS_SAAT THEN X.BIT_SAAT - X.BAS_SAAT + 86400 ELSE X.BIT_SAAT - X.BAS_SAAT END)/3600 AS INTEGER)
ÜŞENME,ERTELEME,VAZGEÇME
Cevapla