Arkadaşlar geliştirmekte olduğum bir rezervasyon sisteminde SQL de bir konuyu bir türlü çözebilmiş değilim. yardımlarınızı bekliyorum.
Create Table OtelPeriod ( OtelPeriodID int IDENTITY(1,1)Primary Key, OtelID int, Tarih datetime )
INSERT INTO OtelPeriod (OtelID,Tarih)Values(1,'2012-03-16') INSERT INTO OtelPeriod (OtelID,Tarih)Values(1,'2012-03-17') INSERT INTO OtelPeriod (OtelID,Tarih)Values(1,'2012-03-18') INSERT INTO OtelPeriod (OtelID,Tarih)Values(1,'2012-03-19')
INSERT INTO OtelPeriod (OtelID,Tarih)Values(2,'2012-03-15') INSERT INTO OtelPeriod (OtelID,Tarih)Values(2,'2012-03-16') INSERT INTO OtelPeriod (OtelID,Tarih)Values(2,'2012-03-17') INSERT INTO OtelPeriod (OtelID,Tarih)Values(2,'2012-03-18') INSERT INTO OtelPeriod (OtelID,Tarih)Values(2,'2012-03-19')
INSERT INTO OtelPeriod (OtelID,Tarih)Values(2,'2012-03-17') INSERT INTO OtelPeriod (OtelID,Tarih)Values(2,'2012-03-18') INSERT INTO OtelPeriod (OtelID,Tarih)Values(2,'2012-03-19') INSERT INTO OtelPeriod (OtelID,Tarih)Values(2,'2012-03-20')
istediği şey ise şu.
Siteden 2 tarih seçtiğinizi ve bu iki tarih arasında olan otelleri listelediğini düşünün.
Ornek 1: Birinci Tarih : 2012-03-16 İkinciTarih : 2012-03-18 ise 16 ve 18 in yer aldığı OtelID 1 ve 2 gelmesi lazım
Ornek 2: Birinci Tarih : 2012-03-15 İkinciTarih : 2012-03-18 ise 16 ve 18 in yer aldığı OtelID 2 gelmesi lazım diğerleri gelmemeli.
Bu konuda Between , in, <= ve >= gibi bir çok fonksiyonu kullandım ama her seferinde eğer field içinde bu tarihlerden biri varsa hepsi geliyor. bu iki tarihten biri bile yoksa o otelin gelmemesi lazım.
Bu konunun between ile çözüleceğini düşünüyorum. ama between iki tarih arasında bir tanesi bile varsa lislelediği için "Tarih Between '2012-03-15' And ' 2012-03-18' burada betweene eğer '2012-03-15' yoksa getirme o oteli nasıl derim.
where cümlesine tarih = x or tarih = y diyeceksin ve sellectde de count(OtelID) , OtelID olacak aldıktan verileri aldıktan sonra 2 , OtelID olan istediğin otellerdir bunuda bir dış sellect de süzebilirsin where count = 2 gibi yani
select OtelID from (select count(OtelID) as adet ,OtelID from OtelPeriod where Tarih = x or Tarih = y) where adet = 2
denemedim ama mysql de çalışır mssql de otelıd yede groub eklemen lazım kolay gelsin
selamlar öncelikle tavsiyem boyle büyük projelerde sql değil de linq veya entity framwork bilemedin Nhibernate kullanman sql ile aylarını alır. çunku sonuçta yazılım dilleriyle doğrudan bağlanamayan bir yapıdır sql. yeni başlıyorsan hemen bu sistemlerden birisini öğren ve kullan. neyse senın sorunun cevabına gelirsek tarihlerde between veya <= gibi yapılarda istenen tarihe bir gün daha eklenir. ve < işlemi yapılır. yani < 2012-12-15 (15 aralıktan öncesini istiyorsanız yani 14 arlık gece 23:59:59) bunu kullanın senın dediğin gibi
quote:
Birinci Tarih : 2012-03-16 İkinciTarih : 2012-03-18 ise 16 ve 18 in yer aldığı OtelID 1 ve 2 gelmesi lazım
dediğinde 18 in gelmesini istiyorsan en başta 2012-03-19 dan küçük olup olmadıgı kontrol ettirmen lazım.
projeye yeni başladığın belli ancak GÜN kavramı tüm yazılım dillerinde tanımlanan günden farklıdır. otelcilik günü otel odasının teslim edildiği saat 2 de başlar odanın teslim alındığı ertesi gün 11 de biter. yani otelcilikte gün 21 saattir(bu otelin teslim ve geri alma şartlarına göre değişir) birkere kullandığın yazılım dilinin Tüm Date yapısını değiştirmeni override ve overload etmeni öneririm. boylece, müşterinin kaldığı günü hesaplayabilir ve muhasebesini yapabilirsin. yani 2 de girip ertesi gün 1 de çıkmış adam yaızlım dilinde 1 günü doldurmamışken otelcilikte 1 gününü doldurmuş 2. gününe girmiştir. o yuzden ücretlendirilmelidir.
yapının da tamamen yanlış olduğunu söyleyebilirim. günlere göre otelin doluluğu diye birşey olmaz. günlere göre otel odalarının doluluğu olur. ve otel odasının otelId, otelodasiId,otelodasiStatus gibi parametreleri olur. otel odası dolu ise statusu dolu olur ve sen sorgunu şu iki tarih arasında otel statusu boş olanları getir dediğinde gelir. yani 5 gun kalacak bir müşteriyi 2 gün 15 nolu odada 3 gün de 25 nolu odada yatırman gerekebilir. yoksa inanılmaz rezervasyon boşluğu yaratırsın. bu da işletme açısından çok zarardır.
quote:
Orijinalden alıntı: Kaygerya
Yapının da tamamen yanlış olduğunu söyleyebilirim. günlere göre otelin doluluğu diye birşey olmaz. günlere göre otel odalarının doluluğu olur. ve otel odasının otelId, otelodasiId,otelodasiStatus gibi parametreleri olur. otel odası dolu ise statusu dolu olur ve sen sorgunu şu iki tarih arasında otel statusu boş olanları getir dediğinde gelir. yani 5 gun kalacak bir müşteriyi 2 gün 15 nolu odada 3 gün de 25 nolu odada yatırman gerekebilir. yoksa inanılmaz rezervasyon boşluğu yaratırsın. bu da işletme açısından çok zarardır.
Yapı aslında olması gereken diye düşünüyorum ama anlatımdan sonra yanlış varsa düzelt lütfen. Proje yeni değil, Asp.net C# geçmişim 10 yıl var. entry framework öğrenmedim.
Yapıyı anlatim.
Otel kendi otelini ekledikten sonra öncelikle O Otele ait Odaları Eklemesi Gerekiyor. Single Room, Double Room gibi. Daha sonra Otel Eklediği Odaların Konaklama Tipini Eklemesi Gerekiyor. Bad & Breakfeast, Room Only gibi Daha sonra isel Otel şunu yapıyor. Double Room - RoomOnly odasından kaç adet var, Fiyatı Ne, Kişi Sayısı, Yetişkin Sayısı, Çocuk Sayısı, Tarih, Bu tür bilgileri giriyor. Bunun Sebebi hergün bu odanın fiyatı farklı olabilir. hergün oda sayısı farklı olabilir.
Şimdi.
Kullanıcı site üzerinden search ederken seçtiği tarihler nedir. 2012-03-16 ve 2012-03-18 Kişi sayısı nedir 2 Yetişkin sayısı nedir 2 Çocuk sayısı nedir 0 Bu bilgiler bana daha önce Otele Oda tanımlarken yapılan bilgiler doğrultusunda. Bu odanın Double Room olduğunu gösteriyor, Bende Double Roomdan müşterinin seçtiği tarihlerde otel müsaitmi. diye sorgulamak istiyorum.
Gerçekte sorgum aşağıda. Bu sorguda 3 kayıt geliyor ama aslında bu 3 kayıttan birinde '2012-03-16' tarihi yok. yani otel o gün benim istediğim Double Room özellikli oda vermemiş. Otelin verdiği Oda 17 sinde başlıyor 20 sinde bitiyor. yani aslında listede yer almaması gerekiyor. ama between 17 tarihinede baktığı için o kayıdıda getiriyor.
Select Otel.OtelID,OdaTipi.OdaTipiAdi From Otel INNER JOIN OtelPeriod ON OtelPeriod.OtelID=Otel.OtelID INNER JOIN OtelOdalar ON OtelOdalar.OtelOdalarID=OtelPeriod.OtelOdalarID INNER JOIN OdaTipi ON OdaTipi.OdaTipiID=OtelOdalar.OdaTipiID Where Otel.Aktif=1 And OtelPeriod.Aktif=1 And OtelOdalar.Aktif=1 And OtelOdalar.KisiSayisi=2 And OtelOdalar.Yetiskin=2 And OtelOdalar.Cocuk=0 And OtelPeriod.Stok > 0 And Tarih Between '2012-03-16' And '2012-03-17' Group By Otel.OtelID,OdaTipi.OdaTipiAdi Order By MIN(OtelPeriod.SatisFiyat) Asc
Select Otel.OtelID,OdaTipi.OdaTipiAdi From Otel INNER JOIN OtelPeriod ON OtelPeriod.OtelID=Otel.OtelID INNER JOIN OtelOdalar ON OtelOdalar.OtelOdalarID=OtelPeriod.OtelOdalarID INNER JOIN OdaTipi ON OdaTipi.OdaTipiID=OtelOdalar.OdaTipiID Where Otel.Aktif=1 And OtelPeriod.Aktif=1 And OtelOdalar.Aktif=1 And OtelOdalar.KisiSayisi=2 And OtelOdalar.Yetiskin=2 And OtelOdalar.Cocuk=0 And OtelPeriod.Stok > 0 And Tarih Between '2012-03-16' And '2012-03-17' Group By Otel.OtelID,OdaTipi.OdaTipiAdi Order By MIN(OtelPeriod.SatisFiyat) Asc
yeni mesaja git
Yeni mesajları sizin için sürekli kontrol ediyoruz, bir mesaj yazılırsa otomatik yükleyeceğiz.Bir Daha Gösterme