+ Yanıtla
Toplam 9 sonuçtan 1 ile 9 arası olanlar

Konu Başlığı: tarihler arasındaki ve fiyatları nasıl toplarım

  1. #1

    tarihler arasındaki ve fiyatları nasıl toplarım

    Bunu çözen ne dilerse dilesin benden
    gelen başlangıç ve bitiş tarihine göre database de bulunan tarihlerdeki fiyatları almak istiyorum.


    bir tablom var sütünları : tarihbaslangic | tarihbitis | fiyat

    icindekiler :
    tarihbaslangic | tarihbitis | fiyat

    01.01.2009 | 15.01.2009 | 12
    16.01.2009 | 25.01.2009 | 15
    26.01.2009 | 30.01.2009 | 12

    gelen tarih aralıgına göre
    örnek( 12.01.2009 / 22.01.2009) bu tarih arasındaki tabloda bulunan fiyata göre toplama yapmak istiyorum

    toplamda : 138 çıkması gerekiyor.

    12.01 - 15.01 den 4 gün X 12
    16.01 - 22.01 den 7gün X 15

    bu hesaplamayı yapacak SQL sorgusu varmı ?

    elimde mssql procedure var ama bu konuda çok fazla bilgim olmadığı için ASP ile çözmek istiyorum.
    yardım ederseniz sevinirim.

  2. #2

    Re: tarihler arasındaki ve fiyatları nasıl toplarım

    Yapabileceğin ilk şey, kullanıcının girdiği sınırlar dahilindeki bütün tarihleri veritabanından çektikten sonra her günü tek tek hesaplamak;

    Mesela kullanıcı 01.01.2009 ile 03.01..2009 aralığını vermiş olsun;

    select * from tablo where ilktarih >= '01.01.2009' and sontarih >= '03.01.2009' and ilktarih <= 03.01.2009......gibi..gibi

    veritabanından gelen ilk sıra 01.01.2009 - 05.01.2009 - 15 olsun sen bunu bir diziye (array);

    01.01.2009 - 15
    02.01.2009 - 15
    03.01.2009 - 15
    04.01.2009 - 15
    05.01.2009 - 15

    şeklinde yazıp veritabanından gelen her sırayı bu şekilde arraya çevirdikten sonra kullanıcıının girdiği tarih aralığındaki fiyatı hesaplayabilirsin.

    İkinci aklıma gelen şey ise, sistemini değiştirip tarih aralığı değil her tarihe bir fiyat girişi yapabilirsin.

    Sanırım bu bir otel sitesi ve her otelin olduğu gibi oldukça abes bir çalışma sistemleri var.

    Eğer benim çözümümü seçersen kinder surprise istiyorum adresi bilahare özel mesajla gönderirim

  3. #3

    Re: tarihler arasındaki ve fiyatları nasıl toplarım

    anlamadığım, 138'i nasıl bulduğunuz?

    4x12 + 7x15 = 153 değil mi?

    eğer doğru ise bir şeyler önerebilirim, ama 138'in epey uğraştırdığını da söylemeliyim

    Kod:
    declare @s smalldatetime, @f smalldatetime
    set @s = '09.12.2009'
    set @f = '09.22.2009'
    
    select sum(fiyat* 
    case when dateadd(day, -1, @s)<tarihbaslangic and dateadd(day, 1, @f)>tarihbitis then datediff(day,tarihbaslangic, tarihbitis) else 
    case when dateadd(day, -1, @s)>tarihbaslangic and dateadd(day, 1, @f)>tarihbitis then datediff(day,dateadd(day, -1, @s), tarihbitis) else 
    case when dateadd(day, -1, @s)<tarihbaslangic and dateadd(day, 1, @f)<tarihbitis then datediff(day,tarihbaslangic, dateadd(day, 1, @f)) else 0 end end end)
    from tablo_adi
    where dateadd(day, -1, @s) < tarihbitis and dateadd(day, 1, @f) > tarihbaslangic
    
    bu kodu query analizer'da test eder misiniz?

    not: alanların smalldatetime olduğunu ve saat:dakika:saniye bilgisinin tutulmadığını varsaydım.
    Mesaj absconder tarafından 21.10.2008 (23:47) yeniden düzenlendi.
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  4. #4

    Re: tarihler arasındaki ve fiyatları nasıl toplarım

    absconder, bu sorgunun doğru bir sonuç getireceğine emin misin? biraz çamur atayım maksat kinder surprise'ı tek başıma yemek

  5. #5

    Re: tarihler arasındaki ve fiyatları nasıl toplarım

    bu sorgu, bitiş tarihi, bizim başlangıç tarihimizden büyük ve başlangıç tarihi bizim başlangıç tarihimizden büyük kayıtları getirmesi lazım. bunun amacı, tarih aralığı bizim tarih aralığımızdan küçük fiyat dilimlerinin olabilmesi.

    1. sonra da, eğer bitiş tarihi bizim başlangıç tarihimizden büyük, ve bitiş tarihi bizim bitiş tarihimizden küçükse, bu tarih aralığındaki gün sayısı,

    2. eğer bitiş tarihi bizim başlangıç tarihimizden büyük ve bitiş tarihi bizim bitiş tarihimizden küçükse, bizim başlangıç tarihimizden, aralığın bitiş tarihine kadar olan gün sayısını,

    3. eğer başlangıç tarihi bizim başlangıç tarihimizden büyük ve btiş tarihi de bizim bitiş tarihinden büyükse, başlangıç tarihinden, bizim bitiş tarihimize kadar olan gün sayısını alıyoruz.

    tabi bunların hepsinin, tarih aralığı olmadan hep perpeşe tanımlamalar yapıldığı ön kabulünü yaparak buluyoruz.

    aslında her gün için fiyat tanımı yapılıp buna göre sorgu yapılması daha doğru yaklaşım olabilirdi.
    Ekli Dosya(lar)
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  6. #6

    Re: tarihler arasındaki ve fiyatları nasıl toplarım

    İlginiz için çok teşekkür ederim
    istediğiniz kinder olsun, kaç gündür uğraşıyorum gönderin çalışan çözümü koli ile kinder alayım size

    mow tahmin ettiğin gibi bu bir otel sitesi, girilen tarihe göre fiyatlar çıkacak. birden fazla otel olduğu için çok karışık bir sistemi var.
    otellerin oda tipleri, çocuk yaşlarına göre indirimi veya ücretsiz, ve hb,bb,sc... gibi özelliğe göre baştakilerde değişiyor.
    yani sadece odayı veya hem odayı hemde çocuğun yaşına göre fiyatını
    bir odada kaç kişi kalabiliri bunların hepsi değişken.
    bu yüzden kafam çok karıştı.

    daha önceden sadece oda fiyatlarını hesaplatıyordum aşağıdaki stored prosedure ile
    ama yukarıdaki olaylar işin içine girince procedure lere girmeyeceğim

    dediğin gibi array larla çözeceğim sanırım biraz uğraşayım bakayım

    absconder 138 kafanı karıştırdı biliyorum özür dilerim
    hata benden kaynaklanıyor 153 ü bilerek yazmadım.

    __________________________________________________ ___

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO


    ALTER PROCEDURE [dbo].[Toplam_Fiyat] @PBasla as datetime,@PBitis as datetime,@POdanumarasi as integer
    AS
    declare @DBaslangic datetime
    declare @Dtoplam integer
    declare @DFiyat integer
    declare @DMiktar as integer
    declare @DEldevar as integer
    declare @DSatilan as integer
    declare @DSs as integer
    declare @Catagory as varchar(50)
    declare @Type as varchar(50)
    declare @Capacity as integer

    Set @DBaslangic=@PBasla
    Set @Dtoplam=0
    Set @DFiyat=0
    Set @DEldevar=0

    Select @Catagory=catagory,@Type=tip,@Capacity=max_capacit y from Odalar where Odanumarasi=@POdanumarasi

    WHILE (@DBaslangic <=@PBitis-1)
    BEGIN


    if EXISTS(Select Miktar from Extraoda where Odanumarasi=@POdanumarasi and start<=@DBaslangic and finish>=@DBaslangic)
    Select @DMiktar=Miktar from Extraoda where Odanumarasi=@POdanumarasi and start<=@DBaslangic and finish>=@DBaslangic
    else
    Select @DMiktar=Default_Room from Odalar where Odanumarasi=@POdanumarasi


    Select @DSatilan=sum(miktar) from SatinAlinmislar where Odanumarasi=@POdanumarasi and start<=@DBaslangic and finish>=@DBaslangic
    if (Isnull (@DSatilan,0) =0)
    Set @DSatilan=0

    Set @DSs=@DMiktar-@DSatilan

    if @DSs<@DEldevar or @DEldevar=0
    Set @DEldevar=@DSS

    SELECT @DFiyat=price from OdaFiyatlari where start<=@DBaslangic and finish>=@DBaslangic and Odanumarasi=@POdanumarasi

    Set @DToplam=@DToplam+@DFiyat
    Set @DBaslangic=@DBaslangic+1

    END

    select @DToplam as toplam,@DEldevar as donen,@Catagory as Catagory,@Type as Type,@Capacity as capacity

  7. #7

    Re: tarihler arasındaki ve fiyatları nasıl toplarım

    aslında ben tek query ile çözmeye çalışmıştım ama procedure ile çözümü daha anlaşılır olur.

    verdiğiniz sp'de ek bilgiler de olmasna rağmen, yaklaşımı doğru buldum. anladığım kadarıyla mantığı şu,

    verdiğimiz tarih aralığında gün gün kontrol yapılarak, o güne denk gelen fiyattan toplamı buluyor.

    bence mantığınızı buna göre oturtursanız daha kesin ve doğru sonuca ulaşırsınız.
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  8. #8

    Re: tarihler arasındaki fiyatları nasıl toplarım

    Evet başlıktada belirttiğim gibi mantık bu zaten

    sanırım şöyle sormam gerekiyordu

    elimizde giriş ve çıkıştarihi adında değişkenimiz var
    giristarihi = "12.01.2009"
    cikistarihi = "22.01.2009"

    datamızda ise tarihler arasında fiyatlarımız var
    Sütün | Sgiristarihi | Scikistarihi | Sfiyar
    1 | 01.01.2009 | 15.01.2009 | 12
    2 | 16.01.2009 | 25.01.2009 | 15
    3 | 26.01.2009 | 30.01.2009 | 12

    birinci satırdan kaç gün
    ikinci satırdan kaç gün
    olduğunu bulmam gerekiyor.

  9. #9

    Re: tarihler arasındaki ve fiyatları nasıl toplarım

    Maalesef otellerin mantıklı bir fiyat sistemi yok, her şey kafaya göre, oran yok, sistematik yok. Hatta bu günlerde çoğu otel bu bahsettiğin kriterlerin yanında adamın milliyetine göre de fiyat ayarlaması yapıyorlar (mesela rus ise daha pahalı oluyor genelde). Yani senin yapman gereken hem benim hem absconderın belirttiği gibi altaypıyı her güne ve oranlı olmayan her özelliğe ayrı bir kayıt tutacak şekilde yapman. Oranlı yapabileceklerini iş sahibi ile konuş (mesela +1 yatak = +%20 fiyat gibi) bu şekilde kayıt sayısını azaltabilirsin.

    Bir de şu andaki yapıda yaparsan satışı durdurman gereken günleri tanımlayamazsın ve fiyat- tarih aralıklarında bir değişiklik olduğu zaman kolayca yapamazsın.

+ Yanıtla

Bu konu başlığı için etiketler

Mesaj Seçenekleri

  • Yeni başlık açamazsınız
  • Cevap yazabilirsiniz
  • Dosya ekleyemezsiniz
  • Mesajlarınızı değiştiremezsiniz