Bir problem daha :)

Oracle veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
şimal
Kıdemli Üye
Mesajlar: 516
Kayıt: 10 Kas 2003 09:36
Konum: ANKARA

Bir problem daha :)

Mesaj gönderen şimal » 23 Haz 2006 02:22

Bişeyleri yapar verirsiniz patronunuz dahasını da ister...
İşte bir önceki topicde bahsettiğim karşılaştırmaya birde süre kıyaslaması istediler:

bir tabloda görüşme başlama zamanı, bitiş zamanı:
08:39:39, 08:39:49 şeklinde tutulmuş
görüşme süresi olarak

baslama zamanı- bitiş zamanını saniye cinsinden hesaplamam gerekiyor.
Bunun için

to_date(BITSAAT,'HH/MI/ss') - to_date(BASSAAT,'HH/MI/ss')

şeklinde fark aldım ancak sonucu 0.00011574074074... şeklinde dönderdi.

Olmadı yani :)

Bunu saniye cinsinden nasil hesaplarim?
Boş Başak Dik Durur...
Santranç bitince şah da piyon da aynı torbaya girermiş...

Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 09:11

Mesaj gönderen naile » 23 Haz 2006 02:57

DATEDIFF gibi bir fonksiyon yok mu oracle'da?

danaci
Üye
Mesajlar: 178
Kayıt: 24 May 2005 12:45

Mesaj gönderen danaci » 23 Haz 2006 03:06

http://www.doganzorlu.com/oracle adresinde saat farkı hesaplayan bir prg örneği var incele.
sanırım işinizi görecektir.

Kullanıcı avatarı
şimal
Kıdemli Üye
Mesajlar: 516
Kayıt: 10 Kas 2003 09:36
Konum: ANKARA

Mesaj gönderen şimal » 23 Haz 2006 03:32

tüm değerleri saniyeye çevirip fark aldım oldu :)


select
(
to_number(substr(BITSAAT,1,2))*3600+ to_number(substr(BITSAAT,4,2))*60+to_number(substr(BITSAAT,7,2))
)-
(
to_number(substr(BASSAAT,1,2))*3600+ to_number(substr(BASSAAT,4,2))*60+to_number(substr(BASSAAT,7,2)
)
)
sn from DMS_GUN0515
Boş Başak Dik Durur...
Santranç bitince şah da piyon da aynı torbaya girermiş...

Mennan
Üye
Mesajlar: 144
Kayıt: 22 Haz 2004 02:22
Konum: Istanbul
İletişim:

Mesaj gönderen Mennan » 09 Eyl 2006 09:09

Cevap bulunmuş ama ileride aynı hata ile karşılaşabilecek arkadaşlar için bir çözümünü de ben yazmak istedim.
Oracle'de iki tane date tipi ile normal sayısal değerler arasında fark almak gibi işlem yapabilirsiniz. Sonuç gün cinsinden numerik olarak döner. İstediğiniz formata dönüştürebilirsiniz. Şöyleki;

Kod: Tümünü seç

DECLARE
   start_date                 DATE;
   end_date                   DATE;
   time_difference            NUMBER;
   time_difference_in_seconds NUMBER;
   time_difference_in_minutes NUMBER;

BEGIN
   start_date      := to_date('09.09.2006 09:57:49',
                              'DD.MM.YYYY HH24:MI:SS');
   end_date        := to_date('09.09.2006 09:59:34',
                              'DD.MM.YYYY HH24:MI:SS');
   time_difference := end_date - start_date;

   time_difference_in_seconds := time_difference * 86400; --24*60*60
   time_difference_in_seconds := trunc(time_difference_in_seconds, 4);

   time_difference_in_minutes := time_difference * 1440; --24*60
   time_difference_in_minutes := trunc(time_difference_in_minutes, 4);

   dbms_output.put_line('Start Time : ' ||
                        to_char(start_date, 'DD.MM.YYYY HH24:MI:SS'));
   dbms_output.put_line('End   Time : ' ||
                        to_char(end_date, 'DD.MM.YYYY HH24:MI:SS'));
   dbms_output.put_line('Difference in seconds :' ||
                        time_difference_in_seconds);
   dbms_output.put_line('Difference in minutes :' ||
                        time_difference_in_minutes);
END;

Çıktı ise:

Kod: Tümünü seç

Start Time : 09.09.2006 09:57:49
End   Time : 09.09.2006 09:59:34
Difference in seconds :105
Difference in minutes :1,75
olacaktır.
En son Mennan tarafından 29 Eyl 2006 04:10 tarihinde düzenlendi, toplamda 1 kere düzenlendi.

Kullanıcı avatarı
şimal
Kıdemli Üye
Mesajlar: 516
Kayıt: 10 Kas 2003 09:36
Konum: ANKARA

Mesaj gönderen şimal » 11 Eyl 2006 10:05

Çok teşekkür ederim sağolun...
Boş Başak Dik Durur...
Santranç bitince şah da piyon da aynı torbaya girermiş...

doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 08:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu » 11 Eyl 2006 01:07

Selam,

İki tarihi birbirinden çıkardığınızda 1/86400 lük bir değer elde edersiniz. Bu neden iki tarihi birbirinden çıkarıp 86400 le çarpmanız yeterlidir. Bu sayede saniye cinsinden aradaki farkı bulabilirsiniz.

Kod: Tümünü seç

SELECT (sysdate - TO_DATE ('2006 09 11', 'YYYY MM DD')) * 86400
  FROM dual;
gibi. Bunun nedeni oracle in tarih tipli alanı natice olarak dword ibr alanda tutmasından (tıpkı C ve pascal daki date gibi ki onun da atası unix sistem çağrılarıdır).

Çıkarma işlemi yaptığınızda iki sayıyı birbirinden çıkarırsınız ve bu sayı yüksek bitlerden düşük bitlere doğru paketlenmiş bir bilgi taşır. Detayları heryerde bulabilirsiniz.

Selametle,
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)

Cevapla