C# MSSQL tarih arası veri çekme

Kartlı geçiş sisteminde kartın basılmadığı gün için veritabınında bir hareket oluşmuyor. yani o tarihe veri eklemiyor. Bu yüzden veritabanından koşul eklemesem dahi veri gelmeyecek. bunu c# üzerinden seçtiğim iki tarih arasındaki bütün tarihleri grid üzerine ekleyerek grid üzerindeki tarihin karşısında veritabanın da karşılığı varsa datagrid üzerinde ilgili tarihin karşısına yazdırmam gerekiyor.

Dediğim gibi veritabanı üzerinde örnekteki gibi 14 ve 16 sı var. fakat 15 i hiç bir şekilde mevcut değil. yani olmayan tarihleride listelemek istiyorum :)

Ferhat acar / 14.03.2023 / 08:00 17:00

Ferhat acar / 16.03.2023 / 08:00 17:00
O zaman mesela her gün için kayıt listelenecek, dbden çekilen veri ile kıyaslama yapılacak, dbden o gün için kayıt varsa o yazdırılacak, dbde o gün için kayıt yoksa boş yazdırılacak, doğru mu?

gün1 -> db kayıt var ->db kaydının içini yazdır
gün2 -> db kayıt eşleşmedi ->boş satır at
gün3 -> db kayıt var ->db kaydının içini yazdır
 
1678873981790.png

Evet, mesela resimdeki gibi, kişi izindeyse, kart basmadıysa ya da hafta sonu ise bu şekilde listelenebilmesini istiyorum. 2 tane dateTimePicker arasındaki veriyi listbox a aşağıdaki kodla ekliyorum.

C#:
  DateTime baslangictarihi = Convert.ToDateTime(dateTimePicker1.Text);
            DateTime bitistarihi = Convert.ToDateTime(dateTimePicker2.Text);
            for (; baslangictarihi < bitistarihi; baslangictarihi = baslangictarihi.AddDays(1))
            {
                string tarihA1 = baslangictarihi.Date.ToString("dd/MM/yyyy");
                listBox4.Items.Add(tarihA1 + "\n");
            }

fakat gerisi yok maalesef :)

yani benim önce tarihi listelemem, sonra ismi bulmam, sonra tarih ve isimin karşısına veri varsa yazdırıp datasete işlemem gerekiyor sanırım ama yapamadım.
 
C# a hakim değilim direkt kod ile anlatamayacağım ama şöyle bir çözüm deneyebilirsiniz gibime geliyor;

-istenen tarih aralığı için dbden veriyi çektiniz
-.fill yerine satır satır yazdırmak gerekiyor
-istenen tarih aralığı ne ise bunun için bir for döngüsü kullanacaksınız (14 Mart, 16 Mart aralığı için ise 3 kere çalışacak bir döngü)
-bu for için date bilgisini istediğiniz formata dönüştüreceksiniz (dd.MM.yyyy diyelim)
-elinizde 3 tane gün var ama dbden sadece 2 row geldi (15 Mart için veri yok)
-for içinde hangi günde iseniz dbden gelen rowlar arasında bu tarihi arayacaksınız
---formatlanmış tarih: "14.03.2023", dbden gelen rowların tarih kolonu buna eşit olan bir kayıt var mı?->var: rowu ekrana bastır
---formatlanmış tarih: "15.03.2023", dbden gelen rowların tarih kolonu buna eşit olan bir kayıt var mı?->YOK: ekrana tarihi, kişi adını bastıracaksınız, diğer kolonlar boş
---formatlanmış tarih: "16.03.2023", dbden gelen rowların tarih kolonu buna eşit olan bir kayıt var mı?->var: rowu ekrana bastır

* "dbden gelen rowların tarih kolonu buna eşit olan bir kayıt var mı?" fonksiyonu için c#ta en uygun nasıl yapılır bilmiyorum, javadaki stream api benzeri bir şey kesin vardır, c# bilen arkadaşlar fikir verebilir, yoksa db rowların her birini for ile tek tek gezip tarih kolonu eşit mi diye bakmak kötü bir yaklaşım ama çalışacaktır.

Bu şekilde biraz araştırarak bir çözüm yolu bulabilirsiniz diye anladım, bu basit senaryo için c# bilen arkadaşlar da yardımcı olabilirler.
 
Veritabanın da Tarih kısmının türü nedir nvarchar mı?

DataGridView e bilgileri eklediğiniz butonun kod kısmının görüntüsü ekleyebilir misiniz. (Personel Sorgula, Seçili Personel Sorgula hangisinde ise) (sql sorgu engeline de takılmazsınız =) )
 
Burada sadece dataGridView e sonuçları yazdırmak için kullanıyorsunuz değil mi, Bu kısımda dataset değilde datatable kullansanız sorun olmaz sanırım
 

Geri
Yukarı