Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Mysql Parçalı Tarih Sorgulama
#1
Mysql ile yaptığım bir tablom var. Bu tabloda yil,ay ve gun1-gun2 ... gun31 diye ayrılan bölümlerim var. Bu tablo içerisinde 
örnek olarak 

gün1 ile gun15 arasındaki verileri nasıl sorgulayabilirim. Herkese Kolay Gelsin. İyi Hafta Sonları Dilerim.
Cevapla
#2
Tablo yapınız ne yapmak istediğiniz çok anlaşılmıyor.
Yıl, ay ve günlere ayrı ayrı fieldmi tanımladınız?
Eğer böyleyse sadece gun1...gun15 arasındaki fieldlerimi filtrelemek istiyorsunuz?
Cevapla
#3
Tablomda id, adsoyad, yil, ay, gun1,gun2 ... gun31 şeklinde kolonlarım mevcut.
Bu kolonlardan benim vereceğim iki tarih arasındaki veriyi çekmek istiyorum. gun1...gun15 diyerek örnekleme yaptım.
Cevapla
#4
Merhaba,
mevcut tablo ile iki tarih arası sorgu çok sıkıntılı olur gibime geliyor.
bence 2. bir tablo ile sorgulama yapmanda fayda var.
id, adsoyad, tarih.
iki tablo arasında trigger ile veri güncellemesi yaparsın.
artık hangi tabloya trigger yazarsın sana kalmış.
Cevapla
#5
(03-06-2019, Saat: 00:05)bkantur Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Tablomda id, adsoyad, yil, ay, gun1,gun2 ... gun31 şeklinde kolonlarım mevcut.
Bu kolonlardan benim vereceğim iki tarih arasındaki veriyi çekmek istiyorum. gun1...gun15 diyerek örnekleme yaptım.

Merhaba,

1) Neden böyle bir tasarım yaptığınızı anlayamadım, herhalde mantıklı bir açıklaması vardır. 
2) Tablonuzun DDL Scriptini paylaşabilirmisiniz (Sadece veri tiplerini merak ettiğim için (gun1..gun31'in veri tipi nedir?) )
3) Mevcut durumda aynı tabloya "Tarih" adında fazladan bir sütun daha ekleyip sorgulamalarınızı bu sütunda gerçekleştirebilirsiniz. Böylece mevcut karmaşıklığı dizginlemeniz daha kolay olur...

Misal;
SELECT * FROM TABLONUZ where TARIH BETWEEN '2019-01-01' AND '2019-01-25'
P.Safa:Yaşlanarak değil, yaşayarak tecrübe kazanılır.Zaman insanları değil,armutları olgunlaştırır
C.Yücel:Toprak gibi olmalısın! Ezildikçe sertleşmelisin!Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı
S.Canan:Bildiğini zannettiğin an hiç bir şey öğrenemezsin
Bilgi uçar
WWW
Cevapla
#6
Tablo yapınız şuna benziyor sanırım. İki aşamalı bir çözüm kullanabilirsiniz.

1. Aşama: Yıl ve Ay a göre istenen tarih aralığı filtrelenir.

lQBM2g.png
 SELECT * from t1 
where yil >= 2018 and ay >= 4 
and yil <= 2019 and ay <= 5 

cümlesi ile aşağıdaki gibi bir sonuç alırısınız.

3O2m85.png
2. Aşama: Veriyi işlediğiniz programlama dilinde, sonuç cümlesindeki satırlardaki günler hanelerini işleyebilirsiniz.

Var olan bir sistemde uğraşıyorsanız  ve tablo yapılarını değiştirmek sıkıntı oluşturacaksa bu şartlar dahilinde bir çözüm aramak mantıklı gelebilir, fakat sistemin daha tasarım aşamasındaysanız bu şekildeki bir tablo yapısı işinizi dahada zorlaştıracaktır.

Mesaj yazarken @uparlayan  beyin cevabı daha yoktu. Aklımdan geçen ve yazmadığım noktaları belirtmiş Smile
Cevapla
#7
@uparlayan , soruyu soran henüz bir cevap yazmamış ama, 1. sorunuza istinaden kuvvetle muhtemel bu bir personel puantaj/bordro veritabanı. Bugüne kadar gördüklerimin hepsi bu şekilde veri saklıyor.
Cevapla
#8
Şöyle bir Öneride bulunayım.
Biraz uğraşmanız gerekebilir.

Buradaki Durumunuz şöyle çözülebilir.
şimdi colonlarınız pivot halinde gitmekte onun için öncelikle unpivot yapmanız gerek

select t.id,
c.col,
case c.col
when 'a' then a
when 'b' then b
when 'c' then c
end as data
from yourtable t
cross join
(
select 'a' as col
union all select 'b'
union all select 'c'
) c

kolon isimlerini bildiğini ve sabit olduğu için sadece
union all yerlerine kolon isimlerini yazarak öncelikle yatayda olan veriyi dikey şekilde çekiniz

MySql de Temp table varmı biliyorum varsa

select t.id,
c.col,
case c.col
when 'a' then a
when 'b' then b
when 'c' then c
end as data
from yourtable t
cross join
(
select 'a' as col
union all select 'b'
union all select 'c'
) c

from yourtable yerinden önceye INTO #TEMP yazarak sanalda bir tabloya atınız Eğer temp yoksa
CTE kullanın o da yoksa Fizksel olarak bir tabloya atın
tabloya attıktan sonra bu kez sizin
gun1 gun2 olarak gelecek kolonlarınız bu kez
gun1
gun2
gun3 olarak gelecektir tabiki yıllarda o şekilde

yani Select * from #temp yazdığınız zaman
ID ADI YIL GUNLER
1 deneme 2019 gun1

Şeklinde gelecektir bundan sonra

select * from #temp where GUN between gun1 and gun30 diyerek çekmiş olursunuz
Smile Wink
İnşallah anlatabilmişimdir Smile

Unutmadan Temp tabloda olsa fiziksel bir tabloda olsa

select cümlenizin en başına
Drop Table #temp yada fiziksel tablo adını yazmanız gerekir.
Bunun sonrasında yine yatayda görmek istiyorum diyorsan

yazdığın ve kısıtladığın yanı betweenlediğin tabloyu yeniden pivot olarak yan yana yazdırman gerekir Wink
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  [ÇÖZÜLDÜ]Tarih ve Saat aralığı sorgulama wiseman 39 1.216 23-04-2019, Saat: 17:17
Son Yorum: wiseman
  Tarih Sorgulama OZCANK 11 622 05-04-2019, Saat: 08:13
Son Yorum: m_ekici
Exclamation localdeki belirli portu sorgulama. qnefret 22 1.265 21-03-2019, Saat: 12:05
Son Yorum: qnefret
Thumbs Up tarih sorunsalı ! forumcuali 1 283 06-03-2019, Saat: 08:29
Son Yorum: Tuğrul HELVACI
  Listview veri sorgulama hk. wiseman 15 1.054 13-02-2019, Saat: 11:02
Son Yorum: ssahinoglu



Konuyu Okuyanlar: 1 Ziyaretçi