Doğum Günü Bulmak

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
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Doğum Günü Bulmak

Mesaj gönderen superco »

S.A.

Doğum tarihlerinin olduğu bir tabloda verilen iki tarih arasında doğum günleri olan kayıtları nasıl alabilirim.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

öncelikle hangi veritabanı kullandığını yazmalısın
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7601
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

select *
from doğum_günlerinin_olduğu_tablo
where doğum_günü between tarih1 and tarih2

Kolay gelsin.
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Mesaj gönderen superco »

S.A.
mussimsek yazdı:select *
from doğum_günlerinin_olduğu_tablo
where doğum_günü between tarih1 and tarih2

Kolay gelsin.
Teşekkürler hocam ama biraz yanlış anlattım sanırım. Yazmaya çalıştığım sorgu iki tarih arasındaki doğum günlerini bulmak. Yıldan bağımsız olarak sadece gün ve ay üzerinden çalışacak. Extract komutuyla denedim ama pek başarılı olamadım.

Kod: Tümünü seç

where 
extract(Day from kisiler.dogumtarihi) between extract(Day from '01.01.2006') and extract(Day from '30.12.2006')
and
extract(Month from kisiler.DogumTarihi) between extract(Month from '01.01.2006') and extract(Month from '30.12.2006')
öncelikle hangi veritabanı kullandığını yazmalısın
Başlık zaten Firebird forumunda
Allah herkesin sırtına kaldırabileceği kadar yük koyar
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Zaten çözüme yaklaşmışsın.
Extract kullanmalısın.
Bir kaç örnek çözüm şekli:

Kod: Tümünü seç

WHERE
  EXTRACT(DAY FROM DOGUMTARIHI) BETWEEN 1 AND 31 AND
  EXTRACT(MONTH FROM DOGUMTARIHI) BETWEEN 1 AND 12

WHERE
  EXTRACT(DAY FROM DOGUMTARIHI) BETWEEN :parSTARTDAY AND :parFINISHDAY AND
  EXTRACT(MONTH FROM DOGUMTARIHI) BETWEEN :parSTARTMONTH AND :parFINISHMONTH

WHERE
  EXTRACT(MONTH FROM DOGUMTARIHI) * 1000 + EXTRACT(DAY FROM DOGUMTARIHI) BETWEEN :parSTARTMONTHDAY AND :parFINISHMONTHDAY
İyi çalışmalar.
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Mesaj gönderen superco »

S.A.
Zaten çözüme yaklaşmışsın.
Extract kullanmalısın.
Bir kaç örnek çözüm şekli:
Cevap için teşekkürler. Lakin benim sorunumda burda çıkıyor. Mesela aşağıdaki gibi tarihler bulunan bir tabloda
TARIH
14.02.1991
15.02.1991
01.03.1991
08.03.1991
16.03.1991
17.04.1991

Kod: Tümünü seç

WHERE
  EXTRACT(DAY FROM DOGUMTARIHI) BETWEEN 16 AND 16 AND
  EXTRACT(MONTH FROM DOGUMTARIHI) BETWEEN 2 AND 3
gibi bir sorguyla 16.02.XXXX ile 16.03.XXXX arasındaki kayıtları bulmak istediğimizde sadece 16.03.1991 tarihini çıkartıyor. Aradaki 01.03.1991 ve 08.03.1991 tarihlerini atlıyor.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

tabloyu create ederken bir field daha ekle ve bu field değerini doğumtarihlerinden alsın. mesela 01.12.1999 tarihini bu fielda 12.01 diye otomatik kayıt edilmesişni sağla sorgunu buna göre al. (bunu triger ile yapabilirsin. yada tabloyu create ederken create table ad ...,soyad ..., doğumtarihi...,extract(month from dogumtarihi)....)

databasenin özelliklerine göre tip dönüşümü yaparak alanları birleştirmelisin.
Kolay gele...
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Mesaj gönderen superco »

S.A.
bgoktas yazdı:tabloyu create ederken bir field daha ekle ve bu field değerini doğumtarihlerinden alsın. mesela 01.12.1999 tarihini bu fielda 12.01 diye otomatik kayıt edilmesişni sağla sorgunu buna göre al. (bunu triger ile yapabilirsin. yada tabloyu create ederken create table ad ...,soyad ..., doğumtarihi...,extract(month from dogumtarihi)....)

databasenin özelliklerine göre tip dönüşümü yaparak alanları birleştirmelisin.
Kolay gele...
Cevap için sağolun. Sanırım sql ile yapmanın bir yolu yok. Önerdiğiniz yolla yapıcam mecburen.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

SQL ile yapmanın yolu tabiki var. @Hakan Can'ın yazdığı son örneği biraz değiştirerek şöyle dener misin?

Kod: Tümünü seç

where
  extract(month from dtarihi) * 1000 + extract(day from dtarihi)
  between  :parSTARTMONTH*1000 + :parSTARTDAY and :parFINISHMONTH * 1000 + :parFINISHDAY;
İyi çalışmalar
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Mesaj gönderen superco »

S.A.

bgoktas'ın önerisiyle şu şekilde çözdüm.

Eksorgu adiyla varchar(5) bir alan oluşturdum. Before Insert ve Before Update triggerlarına

Kod: Tümünü seç

NEW.eksorgu=extract(day from NEW.dogumtarihi)||'.'||extract(month from NEW.dogumtarihi);
kodlarını ekledim. Sorgularkende

Kod: Tümünü seç

where
cast(Eksorgu||'.'||extract(year from :baslamatarihi) as date) between :baslamatarihi and :bitistarihi

kullandım.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
superco
Üye
Mesajlar: 68
Kayıt: 05 Haz 2005 06:47
Konum: Düzce

Mesaj gönderen superco »

S.A.

Sağolun t-hex hocam. Sizin yöntem de sorunsuz çalışıyor.

Bir çözüm ararken iki tane buldum :) . Yardımcı olan herkeze teşekkürler.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Örnek verdiğiniz tarihleri aşağıdaki gibi ibexpertte denedim sizin istediklerinizi veriyordu.

Kod: Tümünü seç

 SELECT *
 FROM  DOG_TARIHI   
  where SUBSTRING(DOGUM_TAR  FROM 6 FOR 5) between '02-16' AND '03-16'
Yanlız bir uyarıda bulunayım. Ben verileri ibexpertte 14.02.1991 şeklinde girmiştim ve bana o şekilde görünüyordu. Substringi ilk yazdığımda from 1 for 5 yapmıştım. Yanlız sorgu çalışmadı. substringin ne verdiğine baktım.

1991-02-14 şeklinde girilmişti. Siz de programınızda önce ne verdiğini istersiniz sorguyu sonra denersiniz.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Cevapla