Saat Toplama İşlemi
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Saat Toplama İşlemi
Merhaba arkadaşlar,
puantaj girişlerinin takibi için bir çalışma yapıyorum.
personelin giriş ve çıkış saatlerini sisteme işliyorum, erken yada geç giriş çıkışa göre personele mesai yada kesin saati hesabını yapıyorum.
burada mesai ve kesin saatlerinin toplamlarını almam gerekiyor, bir türlü yapamadım. sql sum fonksiyonu alan integer olmadığı için hata veriyor.
mesai kesinti
00:15:00
01:30:00
00:30:00
00:15:00
00:45:00
toplam :02:15:00 01:00:00
gibi bir toplam almak istiyorum, yardımcı olabilir misiniz
puantaj girişlerinin takibi için bir çalışma yapıyorum.
personelin giriş ve çıkış saatlerini sisteme işliyorum, erken yada geç giriş çıkışa göre personele mesai yada kesin saati hesabını yapıyorum.
burada mesai ve kesin saatlerinin toplamlarını almam gerekiyor, bir türlü yapamadım. sql sum fonksiyonu alan integer olmadığı için hata veriyor.
mesai kesinti
00:15:00
01:30:00
00:30:00
00:15:00
00:45:00
toplam :02:15:00 01:00:00
gibi bir toplam almak istiyorum, yardımcı olabilir misiniz
"Bilginin Doruğuna Hep Birlikte..."
Re: Saat Toplama İşlemi
Merhaba,
Verdiğiniz bilgiler ile yardımcı olmak mümkün değil.
1- Kullandığınız veritabanı nedir?
2- İlgili tablo/tabloların kolon yapısı nedir?
3- Örnek olarak verdiğiniz veriye ait toplama işleminde bize bildirmediğiniz kolonlar ile ilgili bilgi vermemişsiniz. Hangi koşullara göre filtreleme yapıyorsunuz?
4- Giriş hareketini belirleyen bir kolon var mı? Giriş/çıkış değerleri nedir?
5- Fazla mesai nasıl tespit ediliyor?
6- Başka tablolar ile birleştirme yapılması gerekiyor mu? Evet ise birleştirilen tablo örnek verilerini paylaşabilir misiniz?
En azından bu bilgileri temin etmeniz gerekir ki yardımcı olmak isteyen arkadaşların test edip doğru SQL komutunu çıkarmalarına yardımcı olacak doneler olsun.
Verdiğiniz bilgiler ile yardımcı olmak mümkün değil.
1- Kullandığınız veritabanı nedir?
2- İlgili tablo/tabloların kolon yapısı nedir?
3- Örnek olarak verdiğiniz veriye ait toplama işleminde bize bildirmediğiniz kolonlar ile ilgili bilgi vermemişsiniz. Hangi koşullara göre filtreleme yapıyorsunuz?
4- Giriş hareketini belirleyen bir kolon var mı? Giriş/çıkış değerleri nedir?
5- Fazla mesai nasıl tespit ediliyor?
6- Başka tablolar ile birleştirme yapılması gerekiyor mu? Evet ise birleştirilen tablo örnek verilerini paylaşabilir misiniz?
En azından bu bilgileri temin etmeniz gerekir ki yardımcı olmak isteyen arkadaşların test edip doğru SQL komutunu çıkarmalarına yardımcı olacak doneler olsun.
Re: Saat Toplama İşlemi
merhaba Ertan hocam,
1.firebird veri tabanı
2.mesai ve kesinti time veri türünde
3. Örneğin 01.06.2021 ile 04.06.2021 tarihleri arasıda fitreleme yapıldı. bu tarih aralığında hesaplanan mesai ve kesinti saatlerinin toplamını almak istiyorum.
tarih mesai kesinti
01.06.2021 00:30 00:00
02.06.2021 00:00 01:00
03.06.2021 00:15 00:45
04.06.2021 00:45 00:10
Toplam 01:30 01:55 şeklinde toplam aldırmak istiyorum.
4. giriş hareketini sabit bir değerden normal mesai başlangıç saati ve bitiş saati referans olarak günlük bazda ise_giris_saati ve isten_cikis_saati ne göre hesaplayarak mesai yada kesinti saatlerini getiriyorum. takıldığımda 3. numarada belirttiğim mesai ve kesinti saatlerinin toplamını sum ile alamam.
5. fazla mesai mesai başlangıç ve bitiş saati referans alınarak, erken saatte giriş yapıldıysa o kadar süre mesai geç geldiyse de o kadar kesinti hesaplanıyor. Çıkış içinde erken çıkılırsa kesinti, geç çıkılırsa mesai saati hesaplanıyor.
6.Başka tablolarla birleşme yapılmayacak.
ilginiz için teşekkür ederim
1.firebird veri tabanı
2.mesai ve kesinti time veri türünde
3. Örneğin 01.06.2021 ile 04.06.2021 tarihleri arasıda fitreleme yapıldı. bu tarih aralığında hesaplanan mesai ve kesinti saatlerinin toplamını almak istiyorum.
tarih mesai kesinti
01.06.2021 00:30 00:00
02.06.2021 00:00 01:00
03.06.2021 00:15 00:45
04.06.2021 00:45 00:10
Toplam 01:30 01:55 şeklinde toplam aldırmak istiyorum.
4. giriş hareketini sabit bir değerden normal mesai başlangıç saati ve bitiş saati referans olarak günlük bazda ise_giris_saati ve isten_cikis_saati ne göre hesaplayarak mesai yada kesinti saatlerini getiriyorum. takıldığımda 3. numarada belirttiğim mesai ve kesinti saatlerinin toplamını sum ile alamam.
5. fazla mesai mesai başlangıç ve bitiş saati referans alınarak, erken saatte giriş yapıldıysa o kadar süre mesai geç geldiyse de o kadar kesinti hesaplanıyor. Çıkış içinde erken çıkılırsa kesinti, geç çıkılırsa mesai saati hesaplanıyor.
6.Başka tablolarla birleşme yapılmayacak.
ilginiz için teşekkür ederim
"Bilginin Doruğuna Hep Birlikte..."
Re: Saat Toplama İşlemi
Verdiğiniz yanıtlardan anlayabildiğim kadarıyla;
Standard FirebirdSQL içinde zaman toplama imkanı direk olarak yok. Tahminimce en yakın aşağıdaki şekilde yapabilirsiniz. Örneklerin doğru çalıştığı FirebirdSQL 2.5 üzerinde test edilmiştir.
Örnek tablo ve veri oluşturma SQLleri
Alternatif çözüm 1:
Sonuç aşağıdaki gibi olacaktır
Alternatif çözüm 2:
Sonuç aşağıdaki gibi olacaktır
Yukarıdaki sonuçları alıp uygulama içinde gün, saat ve dakika cinsinden hesaplayıp gösterebilirsiniz.
Bu sizin için uygun değil ise UDF olarak istediğiniz sonucu üreten bir fonksiyon yazıp FirebirdSQL'e tanımını yapıp SQL içinde bu fonksiyonu kullanabilirsiniz.
Standard FirebirdSQL içinde zaman toplama imkanı direk olarak yok. Tahminimce en yakın aşağıdaki şekilde yapabilirsiniz. Örneklerin doğru çalıştığı FirebirdSQL 2.5 üzerinde test edilmiştir.
Örnek tablo ve veri oluşturma SQLleri
Kod: Tümünü seç
create table test (
tarih date,
mesai time,
kesinti time
);
commit;
insert into test values('2021-06-01', '00:30', '00:00');
insert into test values('2021-06-02', '00:00', '01:00');
insert into test values('2021-06-03', '00:15', '00:45');
insert into test values('2021-06-04', '00:45', '00:10');
Kod: Tümünü seç
select
sum(extract(hour from mesai)) as mesaisaat,
sum(extract(minute from mesai)) as mesaidakika,
sum(extract(hour from kesinti)) as kesintisaat,
sum(extract(minute from kesinti)) as kesintidakika
from
test
Kod: Tümünü seç
MESAISAAT| MESAIDAKIKA| KESINTISAAT| KESINTIDAKIKA|
BIGINT| BIGINT| BIGINT| BIGINT|
----------------------------------------------------------------
0| 90| 1| 55|
Kod: Tümünü seç
select
(sum(extract(hour from mesai)) * 60) + sum(extract(minute from mesai)) as mesaidakika,
(sum(extract(hour from kesinti)) * 60) + sum(extract(minute from kesinti)) as kesintidakika
from
test
Kod: Tümünü seç
MESAIDAKIKA| KESINTIDAKIKA|
BIGINT| BIGINT|
--------------------------------
90| 115|
Bu sizin için uygun değil ise UDF olarak istediğiniz sonucu üreten bir fonksiyon yazıp FirebirdSQL'e tanımını yapıp SQL içinde bu fonksiyonu kullanabilirsiniz.
Re: Saat Toplama İşlemi
https://firebirdsql.org/refdocs/langref ... teadd.htmlertank yazdı: 06 Haz 2021 09:39 Standard FirebirdSQL içinde zaman toplama imkanı direk olarak yok.....
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Re: Saat Toplama İşlemi
Doğru ifade de eksiklik var. "Aggregate fonksiyonlar (sum gibi) ile time kolonu toplama işlemi yapamazsınız." daha doğru olurdu.freeman35 yazdı: 07 Haz 2021 08:40https://firebirdsql.org/refdocs/langref ... teadd.htmlertank yazdı: 06 Haz 2021 09:39 Standard FirebirdSQL içinde zaman toplama imkanı direk olarak yok.....
Re: Saat Toplama İşlemi
merhaba Ertan hocam
aşağıdaki kodu yazınca 00:00:00 değeri veriyor.
var
m,i:Ttime;
form4.puantaj_sum.Close;
form4.puantaj_sum.UnPrepare;
form4.puantaj_sum.SQL.Clear;
form4.puantaj_sum.SQL.Add('select (sum(extract(hour from mesai)) * 60) + sum(extract(minute from mesai)) as MESAI from PUANTAJ_DETAIL WHERE DNO=:KNO');
form4.puantaj_sum.Prepare;
form4.puantaj_sum.Open;
m:=form4.puantaj_sum.fields[0].asfloat;
showmessage(timetostr(m));
form1.IBDataSet1.Edit;
form1.IBDataSet1.FieldByName('MESAI_TOP').AsDateTime:=m;
//form1.IBDataSet3.FieldByName('KESINTI_TOP').AsDateTime:=i;
//form1.IBDataSet3.FieldByName('KALAN_TOP').AsDateTime:=m-i;
form1.IBDataSet1.Post;
aşağıdaki kodu yazınca 00:00:00 değeri veriyor.
var
m,i:Ttime;
form4.puantaj_sum.Close;
form4.puantaj_sum.UnPrepare;
form4.puantaj_sum.SQL.Clear;
form4.puantaj_sum.SQL.Add('select (sum(extract(hour from mesai)) * 60) + sum(extract(minute from mesai)) as MESAI from PUANTAJ_DETAIL WHERE DNO=:KNO');
form4.puantaj_sum.Prepare;
form4.puantaj_sum.Open;
m:=form4.puantaj_sum.fields[0].asfloat;
showmessage(timetostr(m));
form1.IBDataSet1.Edit;
form1.IBDataSet1.FieldByName('MESAI_TOP').AsDateTime:=m;
//form1.IBDataSet3.FieldByName('KESINTI_TOP').AsDateTime:=i;
//form1.IBDataSet3.FieldByName('KALAN_TOP').AsDateTime:=m-i;
form1.IBDataSet1.Post;
"Bilginin Doruğuna Hep Birlikte..."
Re: Saat Toplama İşlemi
Mesajımın, Tenkit olarak değil de, "hatırlatma" mahiyetinde olduğunu bildirmek isterim.ertank yazdı: 07 Haz 2021 11:52 Doğru ifade de eksiklik var. "Aggregate fonksiyonlar (sum gibi) ile time kolonu toplama işlemi yapamazsınız." daha doğru olurdu.
Vaktim yok, ve ben kod yazmaktansa anlatmayı tercih ediyorum. Bir function yazılabilir, procedure olabilir, execute block olabilir vs vs, çok olasılık var.
kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Re: Saat Toplama İşlemi
Merhaba,ertline yazdı: 07 Haz 2021 11:56 merhaba Ertan hocam
aşağıdaki kodu yazınca 00:00:00 değeri veriyor.
var
m,i:Ttime;
form4.puantaj_sum.Close;
form4.puantaj_sum.UnPrepare;
form4.puantaj_sum.SQL.Clear;
form4.puantaj_sum.SQL.Add('select (sum(extract(hour from mesai)) * 60) + sum(extract(minute from mesai)) as MESAI from PUANTAJ_DETAIL WHERE DNO=:KNO');
form4.puantaj_sum.Prepare;
form4.puantaj_sum.Open;
m:=form4.puantaj_sum.fields[0].asfloat;
showmessage(timetostr(m));
form1.IBDataSet1.Edit;
form1.IBDataSet1.FieldByName('MESAI_TOP').AsDateTime:=m;
//form1.IBDataSet3.FieldByName('KESINTI_TOP').AsDateTime:=i;
//form1.IBDataSet3.FieldByName('KALAN_TOP').AsDateTime:=m-i;
form1.IBDataSet1.Post;
Soru sorar iken gerekli detay bilgi vermeyi unutmayın.
1- Sorgu sonucunda aldığınız değer nedir?
2- Sorgu sonucu toplam dakika ifade eder. TTime değeri değildir. Dolayısıyla sizin 115 gibi bir dakika değerini '1:55' gibi bir string değere çevirmeniz gerekir.
3- Birden fazla defa çalıştıracağınız sorgular için "Prepare" kullanılması tavsiye edilir. Rapor mahiyetinde arada çalıştırılacak sorgular için Prepare kullanmasanız da olur.