Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Gün dönümü olan bir randevu sisteminde saat bazlı kapama nasıl yapılır ?
#1
Selam arkadaşlar;

Elimde bir gün dönümü'nü içeren saat bazında tablo yer alıyor.
Birde kapalı olduğunu saatleri belirten, saat bazında başlangıç ve bitiş değerlerim var.

Amaç tablodaki kapalı olan saat dilimleri ile çakışan randevuları kapatmak ve bu tablodaki kapalı alanına 1 değerini koymak

Bu kadar basit görünen bir işin içerisinden yaklaşık yarım gündür çıkamamış durumdayım
Basitçe test edebilmek adına uğraştığım kodları aşağıda paylaşıyorum

Bu konuda yardımcı olabilecek yada yol gösterebilecek arkadaşlara şimdiden teşekkür ederim.

   

Randevu oluşturmak için kullanılan Script
create function [dbo].[XFT_RandevuSaatleri]
(
   @Sure int = 60, 
   @IlkSaat time = '00:00:00', 
   @SonSaat time = '00:00:00'
)
returns @TmpTable table (BasSaat time, BitSaat time)
as
begin
   declare 
       @Tarih datetime,
       @BasZaman datetime,
       @BitZaman datetime,
       @BasSaat Time, @BitSaat Time

   if @IlkSaat < @SonSaat
   begin
       set @Tarih = cast(getdate() as date)
       set @BasZaman= datetimefromparts(datepart(year, @Tarih), datepart(month, @Tarih), datepart(day, @Tarih), datepart(hour, @IlkSaat), datepart(minute, @IlkSaat), 0, 0)
       set @BitZaman= datetimefromparts(datepart(year, @Tarih), datepart(month, @Tarih), datepart(day, @Tarih), datepart(hour, @SonSaat), datepart(minute, @SonSaat), 0, 0)
   end
   else
   begin
       set @Tarih = cast(getdate() as date)
       set @BasZaman= datetimefromparts(datepart(year, @Tarih), datepart(month, @Tarih), datepart(day, @Tarih), datepart(hour, @IlkSaat), datepart(minute, @IlkSaat), 0, 0)
       set @Tarih = dateadd(day, 1, cast(getdate() as date))
       set @BitZaman= datetimefromparts(datepart(year, @Tarih), datepart(month, @Tarih), datepart(day, @Tarih), datepart(hour, @SonSaat), datepart(minute, @SonSaat), 0, 0)
   end 
       
   while @BasZaman < @BitZaman
   begin
       set @BasSaat = cast(@BasZaman as time)
       set @BitSaat = cast(dateadd(minute, @Sure, @BasZaman) as time)
       insert into @TmpTable (BasSaat, BitSaat) values (@BasSaat, @BitSaat)
       
       set @BasZaman = dateadd(minute, @Sure, @BasZaman)
   end

return
end


Kapama için kullanılan Scipt
    
  If OBJECT_ID('tempdb..#T') IS NOT NULL 
      DROP TABLE #T
   select BasSaat, BitSaat, cast(0 as bit) as Kapali into #T from dbo.XFT_RandevuSaatleri(60, '10:00', '03:00') /* Randevu Saatleri oluşturuluyor */

   declare @KBasSaat time = '22:45', @KBitSaat time = '00:05' /* Kapalı olması gereken saatler */

   select * from #T

   update #T
   set Kapali = 1
   where ( ( (@KBasSaat < @KBitSaat) and ( (BasSaat >= @KBasSaat and BasSaat < @KBitSaat) or (BitSaat > @KBasSaat and BitSaat <= @KBitSaat) ) )
           or
           ( (@KBasSaat > @KBitSaat) and  
               ( ( 
                   (BasSaat >= @KBasSaat and BasSaat <= '23:59') or (BasSaat > '00:00' and BasSaat <= @KBitSaat) )
                   or
                 ( (BitSaat >  @KBasSaat and BitSaat <= '23:59') or (BitSaat >= '00:00' and BitSaat <= @KBitSaat) )
               )
           )
         )
       
   select * from #T where Kapali = 1
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#2
Çok güzel bir zeka jimnastiğiydi. Çözüme bakmadan kendiniz çözmeye çalışın derim, eğlenceli Smile
Özelden de baya bir deneme - düzeltme sonrası çözümü şu şekilde bulduk ...

1. Kapanış parametrelerini ve veritabanındaki randevu saat aralıklarını Integer' a çevirdik.
2. Hem parametrelerde, hem verilerde, başlangıç saati, bitiş saatine eşit olan değerlerde, bitiş saatine 59 dakika karşılığı 59 değerini ekledik.
3. Hem parametrelerde, hem verilerde, bitiş saati, başlangıç saatinden küçük olan değerlerde, bitiş saatine 24 saat karşılığı 2400 değerini ekledik.
4. Çekilen verilerde, bu yapılanlara göre bir takım güncellemeler yaptık.
5. Son olarak, kapanacak saat aralığıyla çakışan randevuların Kapanışlarını 1' e set ettik.

T-SQL Kodu :


Declare @tBaslangic As Time = '22:45';
Declare @tBitis As Time = '00:15';

Declare @iBaslangic As Int = Cast(Replace(Convert(varchar, @tBaslangic, 108),':','') As Int) / 100;
Declare @iBitis As Int = Cast(Replace(Convert(varchar, @tBitis, 108),':','') As Int) / 100;
Declare @bParamBitisArtti As Bit = 0;

if (@iBitis = @iBaslangic)
Set @iBitis = @iBitis + 59;

if (@iBitis < @iBaslangic)
Begin
Set @iBitis = @iBitis + 2400;
Set @bParamBitisArtti = 1;
End

Select @iBaslangic, @iBitis

If OBJECT_ID('tempdb..#T') IS NOT NULL
   DROP TABLE #T

CREATE TABLE #T(
    Id INT PRIMARY KEY,
BaslangicSaati Int,
    BitisSaati Int,
    Kapali Bit
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
1,
Cast(Replace(Convert(varchar, Cast('10:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('11:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
2,
Cast(Replace(Convert(varchar, Cast('11:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('12:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
3,
Cast(Replace(Convert(varchar, Cast('12:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('13:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
4,
Cast(Replace(Convert(varchar, Cast('13:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('14:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
5,
Cast(Replace(Convert(varchar, Cast('14:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('15:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
6,
Cast(Replace(Convert(varchar, Cast('15:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('16:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
7,
Cast(Replace(Convert(varchar, Cast('16:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('17:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
8,
Cast(Replace(Convert(varchar, Cast('17:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('18:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
9,
Cast(Replace(Convert(varchar, Cast('18:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('19:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
10,
Cast(Replace(Convert(varchar, Cast('19:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('20:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
11,
Cast(Replace(Convert(varchar, Cast('20:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('21:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
12,
Cast(Replace(Convert(varchar, Cast('21:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('22:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
13,
Cast(Replace(Convert(varchar, Cast('22:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('23:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
14,
Cast(Replace(Convert(varchar, Cast('23:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('00:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)


Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
15,
Cast(Replace(Convert(varchar, Cast('00:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('01:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
16,
Cast(Replace(Convert(varchar, Cast('01:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('02:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Insert Into #T (Id, BaslangicSaati, BitisSaati, Kapali) Values
(
17,
Cast(Replace(Convert(varchar, Cast('02:00' As Time), 108),':','') As Int) / 100,
Cast(Replace(Convert(varchar, Cast('03:00' As Time), 108),':','') As Int) / 100,
Cast(0 As Bit)
)

Update #T Set #T.BitisSaati = #T.BitisSaati + 59 Where #T.BitisSaati = #T.BaslangicSaati;
Update #T Set #T.BitisSaati = #T.BitisSaati + 2400 Where #T.BaslangicSaati > #T.BitisSaati;

if (@bParamBitisArtti = 1)
Begin
Update #T Set #T.BaslangicSaati = #T.BaslangicSaati + 2400, #T.BitisSaati = #T.BitisSaati + 2400 Where (#T.BaslangicSaati < #T.BitisSaati) And ((#T.BaslangicSaati < 1000) Or (#T.BitisSaati < 1000))
End

-- Select * From #t

Update #T Set Kapali = Cast(1 As Bit)
Where
((@iBaslangic <= #T.BaslangicSaati) And (@iBitis > #T.BaslangicSaati)) Or
((@iBaslangic < #T.BitisSaati) And (@iBitis > #T.BitisSaati)) Or
((@iBaslangic <= #T.BaslangicSaati) And (@iBitis > #T.BitisSaati)) Or
((@iBaslangic >= #T.BaslangicSaati) And (@iBitis <= #T.BitisSaati))


Update #T Set #T.BaslangicSaati = #T.BaslangicSaati - 2400 Where #T.BaslangicSaati >= 2400;
Update #T Set #T.BitisSaati = #T.BitisSaati - 2400 Where #T.BitisSaati >= 2400;

Select * From #t

-- Update AsilTablo Set Kapali = 1 Where Id In (Select Id From #T Where Kapali = 1)
Hiçbir mal sizin değil, neyi bölüşemiyorsunuz ?
Hiçbir can sizin değil, niye dövüşüyorsunuz ?

Hz. Mevlana
Cevapla
#3
Acaba int (yada TarihSaat) formatına dönüştürmeden bunu bir where şartı ile yazmak gerekseydi ozaman nasıl olacaktı
Bu konuda cevap yazacaklara ancak elimden gelen +10 puan vermek olabilecektir.

@Gürcan beyede ayrıca desteğinden dolayı teşekkür ederim.
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#4
Selamlar. 

Eğer bir hata yapmadıysam aşağıdaki gibi bir düzenleme sorunu çözüyor  Shy

Mantık olarak; kapalı olan saatin başlangıcı bitişten büyük ise bu saat aralığını içerdeki saatin durumuna göre 22:45 - 23:59 veya 00:00 - 00:05 olarak değiştiriyorum.

İçerdeki saat aralığında başlangıç bitişten büyük ise bitiş saatini 23:59 olarak değiştiriyorum.

    If OBJECT_ID('tempdb..#T') IS NOT NULL
     DROP TABLE #T
  select BasSaat, BitSaat, cast(0 as bit) as Kapali into #T from dbo.XFT_RandevuSaatleri(60, '10:00', '03:00') /* Randevu Saatleri oluşturuluyor */

  declare @KBasSaat time = '22:45', @KBitSaat time = '00:05' /* Kapalı olması gereken saatler */

  select * from #T

  update #T
  set Kapali = 1
  where
                (     
                    (@KBasSaat >= BasSaat and @KBasSaat < case when BitSaat < BasSaat then '23:59:00' else BitSaat end)
                        or
                    (@KBitSaat > BasSaat and @KBitSaat < case when BitSaat < BasSaat then '23:59:00' else BitSaat end)
                        or
                    (case when @KBasSaat > @KBitSaat and BasSaat < @KBasSaat then '00:00:00' else @KBasSaat end <= BasSaat
                        and                 
                        (case when @KBasSaat > @KBitSaat and @KBasSaat <
                            case when BasSaat > BitSaat then '23:59:00' else BitSaat end then '23:59:00' else @KBitSaat end) >=
                        case when BasSaat > BitSaat then '23:59:00' else BitSaat end
                    )
                )      
       
  select * from #T where Kapali = 1
Cevapla
#5
@omeraktas kesinlikle olmuş aklıma gelen tüm kombinasyonları denedim ve sorunsuz çalışıyor emeğinize sağlık teşekkürler
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Question json yapma oluşturma, nasıl olur noname101 8 502 05-05-2021, Saat: 20:51
Son Yorum: noname101
  Dbimage da png resimeri nasıl gösterebiliriz? Hsavci 2 192 15-04-2021, Saat: 02:47
Son Yorum: Hsavci
  Delphi'de harici font dosyası kullanma imkanı varmı? Nasıl? ferhatganem 2 295 04-04-2021, Saat: 14:56
Son Yorum: ozcanm
  cxscheduler randevu takvimi erdogan 0 309 10-03-2021, Saat: 09:07
Son Yorum: erdogan
  Hash kodla program açma kapama gonulali 6 1.006 04-03-2021, Saat: 17:08
Son Yorum: gonulali



Konuyu Okuyanlar: 1 Ziyaretçi