Basit bir alış veriş sepetinin mantığı.

Elimden geldiğince e-ticaret sitelerinin en önemli unsurlarından biri olan alış-veriş sepeti mantığını anlatmaya çalışacağım. Bu konuya değinmemin sebebi sürekli sorulan ve korkulan bir konu olması. Esasında oldukça basit olan bu yapıya adım atmadan önce bize neler lazım bunlara bir bakalım. 2 Adet tablo işimizi görecektir. Bunlardan biri stoklarımızın olacağı stoklar ve sepetimizde saklayacağımız bilgilerin bulunacağı sepet tablosu.

--stoklar
CREATE TABLE [stoklar] (
  [id] int IDENTITY(1, 1) NOT NULL,
  [stokadi] nvarchar(300),
  [fiyat] decimal(10, 2) NULL,
  [parabirimi] nvarchar(5),
  PRIMARY KEY CLUSTERED ([id])
)
ON [PRIMARY]
GO

--sepet
CREATE TABLE [sepet] (
  [id] int IDENTITY(1, 1) NOT NULL,
  [stok_id] int NULL,
  [kullanici_id] int NULL,
  [adet] int NULL,
  [eklenmezamani] datetime NULL,
  PRIMARY KEY CLUSTERED ([id])
)
ON [PRIMARY]
GO

Tablolarımız görüldüğü üzere oldukça basit, sepete ürün eklemek için yapacağımız işlem şu, stoklar tablosundaki id değerini alıp  sepet tablosundaki stok_id alanına yazmak. Sepet tablomuzda bulunan kullanici_id alanı ise sepetin hangi kullanıcıya ait olduğunu anlamamız için sepete ürün ekleyen kullanıcının id bilgisi. Genelde üye giriş yaptığı zaman bu değeri bir sessiona atıyoruz. Sepet tablosuna yeni kayıt eklerken bu bilgiyide ilgili alana yazıyoruz. Örnek bir sql cümlesi yazalım.

-- kullanıcımızın id değeri 1
-- stoklar tablomuzdaki stoğun id değeri 5
-- adetimiz ise 1 olsun

insert into sepet (stok_id,kullanici_id,adet,eklenmezamani) values ('5','1','1',getDate())

Eğer kullanıcı sepetine daha önceden eklemiş olduğu ürünü tekrar eklemek isterse adet bilgisini arttırmak içinse şöyle bir cümle işimizi görecektir.

if not exists(select id from sepet where stok_id=5 and kullanici_id=1)
	insert into sepet (stok_id,kullanici_id,adet,eklenmezamani) values ('5','1','1',getDate())
		else
	Update sepet set adet=adet+1 where stok_id=5 and kullanici_id=1

Kullanıcıya sepetindeki ürünleri göstermek içinse

	Select stoklar.stokadi,stoklar.fiyat,stoklar.parabirimi,sepet.adet from sepet,stoklar where sepet.stok_id = stoklar.id order by sepet.id desc

Kullanıcıya sepetteki ürünleri gösterirken neden stoklar tablosuna bağlanıp fiyat, para birimi ve stok adı gibi verilerini alıyoruz ? Sepete ekleme yaparken bu bilgileri de girseydik daha rahat olmazmıydı ? gibi soruları duyar gibiyim. Bunun sebebi şu, kullanıcının sepetine ürünleri eklediğini varsayalım, aradan bir zaman geçti ve ürünün fiyatı değişti aynı şekilde para birimi veya ürünün adı da değişti. Buyurun ayıklayın pirincin taşını :) Ürün kullanıcı sepetine eklendiğinde 30 liraydı 1 hafta sonra 40 lira oldu, 10 lira zarardasınız. Gösterdiğim şekilde siz stoktan herhangi bir ürünün bilgisini değiştiğinizde tüm kullanıcılar güncel stok bilgilerini görebilirler. Yani bu iki tablo bir birleriyle ilişki içerisindedir. Çok karışık olmadığını düşündüğüm bir konu, sadece kayıt ekliyoruz okadar. Bir sonraki yazıda örneklerle bu işlerimin nasıl çalıştığını, ürünlerin fiyat toplamlarını vb.. sepet işlemlerini anlatmaya çalışacağım. Umarım faydalı olur.

Devamını oku olayı..

İster klasik asp isterse asp.net olsun yeni başlayan arkadaşların bir numaralı sorularının başında devamını oku olayı geliyor. Genelde X karakterden büyükse sona iki nokta şeklinde kullanılıyor. Her zaman olduğu gibi birden fazla yapım şekli bulunuyor, fakat ben bu örnekte işi sql e yıkıyorum. Sebebi ise daha performanslı bir yöntem olduğunu düşünmemden ileri geliyor. Örneğin 500 karakterli bir verimiz olsa bunun sql den gelmesi ve işlenmesi 2 adımdan oluşur ve 500 karakterin yüklenmesi zaman kaybı doğurur. Halbuki direk sql cümlemizle olayı çözersek hem tek adımda hemde karakterlerin istediğimiz kadarını alacağımız için sürede kısalacaktır. Bu benim düşüncem belkide aksi gibidir :) Neyse daha fazla uzatmadan sql kodumuza bakalım..

Gördüğünüz gibi geçenlerde bahsettiğim case ve substring ifadesiyle olayımızı hallediyoruz. Eğer alanAdi içindeki karakter 20 den büyükse ilk 20 karakteri gösteriyor sonuna iki nokta ekliyoruz. 20′ den küçükse direk alanAdi içindeki kaydı alıyoruz. İster klasik asp de ister asp.net de kullanabilirsiniz esasında mssql in olduğu heryerde kullanabilirsiniz ;)

SELECT
case
when Len(alanAdi)>20 Then SUBSTRING(alanAdi,0,20)+'..'
else
alanAdi
end as 'kisaAlanAdi', digerAlanAdi
FROM
TabloAdi
[/html]

T-SQL ile newID, Soundex, Case ve Substring kullanımı

Bazı işlemler vardır kod yazmaya kalkınca dünya kadar satır yazmanız gerekir, halbuki zaman zaman Sql in nimetlerinden yararlanmak olayları bir çırpıda performanslı bir şekilde çözmek anlamına geliyor. Bu nimetleri birer örnekle açıklamaya çalışayım. NewID() herzaman heryerdeki fiks sorulardan biridir, veritabanından rastgele nasıl veri çekerim veya veri kümesinin içinden rastgele x kadar kaydı nasıl çekerim gibi.. satır satır kod yazmak yerine newId fonksiyonunu kullanabilirsiniz.

Örnek;

	Select * From TabloAdi order By NewID() -- tablodaki tüm kayıtları rastgele getirir.
	Select Top 5 * From TabloAdi order By NewID() -- tablodaki tüm kayıtlar içerisinden 5 tanesini rastgele listeler.

Soundex() Esasında çok kabarık bir konu, en özet haliyle yanlış yazımların önüne geçmek için oluşturulmuş bir algoritma. Buradan detaylarına bakabilirsiniz. Google’ nin Bunu mu demek istediniz?mekanızması bunun en iyi örneklerinden biridir. Google’ nin ki kadar gelişmiş olmasada, hiç yoktan sitenizde kullanabileceğiniz bu sistemi Soundex ile birlikte yapabilirsiniz. Mesela Abdullah kelimesini aratırken yanlışlıkla  Abdullak yada Abdullaah yazdığımızda klasik arama yöntemi olan Like ile kayıt boş dönecektir, halbuki soundex kullandığımızda Abdullah kelimesini bulmamız mümkün.

SELECT * FROM TabloAdi WHERE SOUNDEX('kelime') = SOUNDEX(AlanAdi)

Case Sql cümlemizin içinde if kullanımının neredeyse birebir aynını bu şekilde kullanabiliriz. Amacımız elimeze geçen kaydın tam istediğimiz şekilde olması, sql cümlemizden gelen veriyi direk grid veya benzeri bir nesnede listelememizde çok daha verimli olacaktır.

-- sadece if else şeklinde kullanım
SELECT
	Case
		When Adsoyad='Abdullah UĞRAŞKAN' Then 'Tamamdır :)'
	else 'Kimsin sen ?'
	end as 'Sonuc'
FROM
	kullanicilar

-- if elseif else şeklinde kullanım
SELECT
	Case
		When Adsoyad='Abdullah UĞRAŞKAN' Then 'Tamamdır :)'
	    When AdSoyad='Deneme' Then 'Sende Tamam ol :)'
	else 'Kimsin sen ?'
	end as 'Sonuc'
FROM
	kullanicilar

-- eğer koşul gerçekleşirse sonucu diğer tablodan almaya ilişkin bir örnek. Yani eğer adısoyadı abdullah ise görevinin ne olduğunu döndürüyoruz.
SELECT
	Case
		When Adsoyad='Abdullah UĞRAŞKAN' Then (Select gorev from gorevler where id=kullanicilar.gorevid)
	else 'Görevsiz.'
	end as 'Sonuc'
FROM
	kullanicilar

-- örnekler biraz bencil olabilir ama aklıma başka bişiy gelmedi :)

SubString Kaydın başlangıç ve bitişini belirleyebildiğimiz klasik substring fonksiyonun aynısı. Kaydın istediğimiz kısmını görüntülememize olanak sağlan fonksiyonumuz.

select Substring(AlanAdi,1,10) from TabloAdi -- 1=başlangıç, 2=bitiş karakteri.

MSSQL 2005 de Tarih Formatını Değiştirme

Evet yine sql yine tarih formatı :) Bilindiği üzere veritabanın kendi tarih formatı bulunuyor ve bu format varsayılan olarak us_english olarak geliyor. Bilmeyen arkadaşlar için bu tarih formatı Ay-Gün-Yıl (mdy) şeklinde, bizim kullandığımız düzen ise, Gün-Ay-Yıl (dmy). Bu çoğu zaman verileri listelerken, süzerken veya veritabanına kayıt eklerken sizi türlü türlü cambazlıklara iten, sürekli karşınıza farklı sıkıntılarla gelen bir handikap durumudur. Geçenlerde burada bir kısmından bahsetmiştim. Bu olayın sanıyorum ki en kesin çözümü sql serverin ayarlarını isteğimiz doğrultusunda düzenlemek.

Olayın mantığını anlamak açısından olayı biraz uzatmak istiyorum. Sql editörümüzü açıp “select * from sys.syslanguages” yazıp çalıştırdığımızda karşımıza diller ve ayarları geliyor. Kayıtları gördüğünüzde olayı zaten anlıyorsunuz. (Şekil-1)

Şekil-1 (kayıtların bir bölümü)

Sonrasında “select name, language from master.dbo.syslogins” dediğimizde karşımıza kullanıcıların kullandıkları varsayılan dilleri görebiliyoruz. Bu şu demek kullanıcıların dillerini kişiselleştirmemiz mümkün olabiliyor. (Şekil-2)

Şekil – 2

Varsayılan dili öğrenmek için ise “select @@Language, @@Langid” cümlesinizi çalıştırıyoruz. (Şekil 3)

Şekil – 3

Varsayılan dili Türkçe yapmak için “EXEC sp_configure ‘default language’, 22 RECONFIGURE” cümlesini çalıştırıyoruz. Buradaki 22 Tükçe‘ nin langid si, yani “select name, language from master.dbo.syslogins” sorgusunu çalıştırdığımızda karşımıza gelen kayıtlardaki Türkçe‘ nin kaşısındaki langid değeri. Bu çözüm olması gereken şekli, istersek hiç bir şeye bulaşmadan “select * from sys.syslanguages” sorgusunu çalıştırıp elle formatları, gün ve ay isimlerini elle değiştrimemiz de mümkün. Bir yazının daha sonuna geldik, herkese güzel ve mutlu günler dilerim.

T-SQL ile newID, Soundex, Case ve Substring kullanımı

Bazı işlemler vardır kod yazmaya kalkınca dünya kadar satır yazmanız gerekir, halbuki zaman zaman Sql in nimetlerinden yararlanmak olayları bir çırpıda performanslı bir şekilde çözmek anlamına geliyor. Bu nimetleri birer örnekle açıklamaya çalışayım.

NewID() herzaman heryerdeki fiks sorulardan biridir, veritabanından rastgele nasıl veri çekerim veya veri kümesinin içinden rastgele x kadar kaydı nasıl çekerim gibi.. satır satır kod yazmak yerine newId fonksiyonunu kullanabilirsiniz.

Örnek;

        Select * From TabloAdi order By NewID() -- tablodaki tüm kayıtları rastgele getirir.
	Select Top 5 * From TabloAdi order By NewID() -- tablodaki tüm kayıtlar içerisinden 5 tanesini rastgele listeler.

Soundex() Esasında çok kabarık bir konu, en özet haliyle yanlış yazımların önüne geçmek için oluşturulmuş bir algoritma. Buradan detaylarına bakabilirsiniz. Google’ nin Bunu mu demek istediniz?mekanızması bunun en iyi örneklerinden biridir. Google’ nin ki kadar gelişmiş olmasada, hiç yoktan sitenizde kullanabileceğiniz bu sistemi Soundex ile birlikte yapabilirsiniz. Mesela Abdullah kelimesini aratırken yanlışlıkla Abdullak yada Abdullaah yazdığımızda klasik arama yöntemi olan Like ile kayıt boş dönecektir, halbuki soundex kullandığımızda Abdullah kelimesini bulmamız mümkün.

SELECT * FROM TabloAdi WHERE SOUNDEX('kelime') = SOUNDEX(AlanAdi)

Case Sql cümlemizin içinde if kullanımının neredeyse birebir aynını bu şekilde kullanabiliriz. Amacımız elimeze geçen kaydın tam istediğimiz şekilde olması, sql cümlemizden gelen veriyi direk grid veya benzeri bir nesnede listelememizde çok daha verimli olacaktır.

-- sadece if else şeklinde kullanım
SELECT
	Case
		When Adsoyad='Abdullah UĞRAŞKAN' Then 'Tamamdır :)'
	else 'Kimsin sen ?'
	end as 'Sonuc'
FROM
	kullanicilar

-- if elseif else şeklinde kullanım
SELECT
	Case
		When Adsoyad='Abdullah UĞRAŞKAN' Then 'Tamamdır :)'
	    When AdSoyad='Deneme' Then 'Sende Tamam ol :)'
	else 'Kimsin sen ?'
	end as 'Sonuc'
FROM
	kullanicilar

-- eğer koşul gerçekleşirse sonucu diğer tablodan almaya ilişkin bir örnek. Yani eğer adısoyadı abdullah ise görevinin ne olduğunu döndürüyoruz.
SELECT
	Case
		When Adsoyad='Abdullah UĞRAŞKAN' Then (Select gorev from gorevler where id=kullanicilar.gorevid)
	else 'Görevsiz.'
	end as 'Sonuc'
FROM
	kullanicilar

-- örnekler biraz bencil olabilir ama aklıma başka bişiy gelmedi :)

SubString Kaydın başlangıç ve bitişini belirleyebildiğimiz klasik substring fonksiyonun aynısı. Kaydın istediğimiz kısmını görüntülememize olanak sağlan fonksiyonumuz.

select Substring(AlanAdi,1,10) from TabloAdi -- 1=başlangıç, 2=bitiş karakteri.

ASP.NET C# T-SQL ile İlgili İpuçları

Daha çok yeni başlayanların işine yarayacağını düşündüğüm bu yazıda sizlerle, gerek tasarım tarafında gerekse kod tarafında karşılaştığım sıkıntıların çözümlerini, teknik ve taktiklerini paylaşmaya çalışacağım.

  • Birden fazla DataReader kullanmak: Eğer aynı yerde iki adet DataReader nesnesi kullanmak isterseniz karşınıza, “Bu komut ile ilişkili, öncelikle kapatılması gereken açık bir DataReader zaten var.” gibisinden bir hatayla kaşılaşırsınız. Bunu önlemek için ConnectionString’ inize “MultipleActiveResultSets=true” ibaresini eklemelisiniz.
  • Nesnelere özellikler atamak: Örneğin bir tane asp:Label imiz var ve buna kod kısmından bir click yada bir style ataması yapacağız. Bunu yapabilmek için nesnelere Attributes özelliğinden yükleme yapabiliyoruz. Örneğin; Button1.Attributes.Add(“style”, “color:red”); veya Button1.Attributes.Add(“onclick”, “alert(‘deneme’)”); gibi.. Bunu bir kenara not alın çünki çoğu zaman çok işinize yarayacak bir özellik.
  • HTML etiketlerine kod tarafından erişip işlem yapmak: Mesela bir <table> yada <div> iniz var yani HTML ile oluşturduğunuz bir etiket, bunlara runat=”server” ve d=”herhangibirid” ifadelerini eklediğinizde kod tarafından erişip işlem yapabilirsiniz. Örneğin herhangibirid.Visible = false; deyip işlem sonunda o id ye sahip elemanı görünmez yapabilirsiniz. Yani ekstradan javascript kasmanıza gerek kalmaz. Yapabilecekleriniz sadece bu değil tabiki, içine içerik ekleyebilir style ayarlarını değişebilir kısacası desteklenen tüm özellikleri ayarlayabilirsiniz.
  • GridView Nesnesinin renklendirilmesi: Bahsettiğim olay şu, gridview de listeleme yaptığımızda bir satırın farklı diğer satırın farklı renkte olma olayı. Bunu kodla çözememizde mümkün fakat GridView’ in AlternatingRowStyle özelliği ile koda gerek kalmadan rahatça çözelbiliriz. Örnek Kullanım: <asp:GridView ID=”GridView1″ runat=”server”><AlternatingRowStyle BackColor=”Red” /></asp:GridView>
  • Bir işlemi yapmadan önce Eminmisiniz sorusunu javascript kullanarak sorma: İster GridView içinden bir kayıt silerken, ister bir kaydı güncellerken nerde kullanmak isterseniz kullanabileceğiniz bu işlemi, eğere nesnemizde OnClientClick özelliği varsa direk oraya OnClientClick=”return confirm(‘Bu Kategoriyi silmek istediğinizden emin misiniz?’);” yoksa yukarıda anlattığım Attributes şeklinde onclick olarak nesneye ekleyebilirsiniz. NesneId.Attributes.Add(“onclick”,”return confirm(‘Bu Kategoriyi silmek istediğinizden emin misiniz?’)”)
  • Sql sorgusunda Insert ile birlikte Select ifadesini bir arada kullanmak: Normal insert cümlemiz şu şekilde yazılıyor, Insert Into TabloAdi (Alan1,Alan2) Values (‘Değer1′,’Değer2’) anlaşılacağı üzere tablomuzdaki alanlara karşılık gelen değerleri tablomuza ekliyoruz. Diyelimki farklı bir tablodaki kayıtları istediğimiz koşula göre diğer tablomuza ekliyoruz. Hemen örneğimize bakalım; Insert Into VerilerinEklenecegiTablo (Alan1,Alan2,Alan3) Select tablo_alani1, tablo_alani2,'”+TextBox1.Text+”‘ From DigerTablo Where id=1 Gödüğünüz gibi koşullu bir şekilde farklı bir tablodan diğer tabloya kayıtlarımızı ekliyoruz, ekstra olarak dışardan bir verininde girilmesini istiyorsak ” arasına değişkenimizi yada değerimizi yazıyoruz.
  • Aynı anda ilişkili iki tabloya veri eklemek: Öncelikle olayımızı biraz açayım, diyelim veritabanımızdaki iki tabloya kayıt gireceğiz, ama bu tablolar bir birleriyle ilişkili. Yani; id | adsoyad | email —> Bu bizim birinci tablomuz adı Kullanici olsun id | kullanici_id | resimadi | tarih —> Buda bizim Kullanici tablosuyla ilişkili olan Resimler ablomuz olsun. Senaryomuza göre yeni bir kullanıcı kayıt olurken bir resim yüklüyor ve bu resimi biz Resimler tablomuza kayıt yapmak istiyoruz. İlk bakışta kolay gibi görünüyor fakat, ilk anda Kullanici tablosunda ilgili kullanıcıya ait bir kayıt olmadığından id değerinin ne geleceğini bilmiyoruz, yani Resimler tablosundaki kullanici_id yerine yazacağımız id belli değil. Bunu bir kaç değişik yoldan yapmak mümkün, fakat kullandığım yöntemlerin içinde en sağlıklı olanı SELECT IDENT_CURRENT(‘TabloAdi’)) şeklinde sorgulama yapıp gelecek olan id nin ne olduğunu bulmak. Örnek cümlemizin tamamına bakalım;
    Adım 1: Insert Into Resimler (kullanici_id,resimadi,tarih) Select Ident_Current(‘Kullanicilar’),’resminadi.jpg’,’01.01.2009′
    Adım 2:
    Insert Into Kullanicilar (adsoyad,email) values (‘abdullah’,’abdullah@xxx.com’)
    Bu şekildeki kullanımda milisaniye cinsinden aynı anda işlem yapılırsa sıkıntı olabilir, haricinde sıkıntı olması zor. Bu sıkıntıyıda  Transaction kullanarak aşabiliriz. Transaction kullanım örneğinide aşşağıda ayrı bir başlık halinde anlatmaya çalışacağım.
  • Transaction Nedir ve Kullanımı: Zaman zaman aynı anda birden fazla Insert veya Update işlemi yaptığımız oluyor. Bu cümlelerin büyük çoğunluğu zaman zaman birbiriyle ilişkili oluyor. Herhangi bir teknik hata veya farklı nedenlerden dolayı bir kopma olduğunda bütünlüğümüz boluzulur ve kayıtlarımızda ciddi sıkıntılar meydana çıkar. Bunu engellemek için Transaction denen mekanızmayı kullanıyoruz. Bu sayede herhangir bir hata durumunda işlemlerin hiçbiri gerçekleşmiyor, hata olmadığında ise hepsi birden gerçekleşiyor. Hemen bir örnekle Transaction kullanımı örnekleyeyim.
    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["baglanti"].ToString());// Sql bağlantımızı yapıyoruz.
    SqlCommand islem1 = new SqlCommand(“Insert Into TabloAdi_1 (alan1,alan2,alan3) Values (‘değer1′,’değer2′,’değer3′)”, conn);// 1. işlemimiz
    
    SqlCommand islem2 = new SqlCommand(“Insert Into TabloAdi_2 (alan1,alan2,alan3) Values (‘değer1′,’değer2′,’değer3′)”, conn);// 2. işlemimiz
    
    SqlCommand islem3 = new SqlCommand(“Insert Into TabloAdi_3 (alan1,alan2,alan3) Values (‘değer1′,’değer2′,’değer3′)”, conn); // 3.işlemimiz
    
    conn.Open(); // Bağlantımızı açıyoruz.
    SqlTransaction sqlTrans = conn.BeginTransaction(); // Transaction nesnemizi tanımlıyoruz.
    
    // Transaction nesnesine işlemleri eşitliyoruz.
    islem1.Transaction = sqlTrans ;
    islem2.Transaction = sqlTrans ;
    islem3.Transaction = sqlTrans ;
    //Burda try cath bloğunu kullarak hata olmadığında ve olduğunda yapılacak işlemleri belirtiyoruz.
    try
    { // eğer hata yoksa try bloğunun içi çalışır !
    islem1.ExecuteNonQuery();
    islem2.ExecuteNonQuery();
    islem3.ExecuteNonQuery();
    sqlTrans.Commit(); // hiç bir problem oluşmamışsa işlemlerimiz yapılıyor.
    }
    catch (Exception hata)
    { // eğer bir hata olmuşsa catch bloğu çalışır !
    Response.Write(“İşleminiz yapılamadı, Oluşan Hatanın Detayı<br />”+hata);
    sqlTrans.Rollback(); // herhangi bir sebepten dolayı hata oluşmuşsa işlemlerimiz geri alınıyor yani yapılmıyor.
    }
    finally
    { // hata olsun olmasın finally bloğunun içi çalışır ! burda nesneleri sonlandırıyoruz.
    conn.Close();
    conn.Dispose();
    sqlTrans.Dispose();
    islem1.Dispose();
    islem2.Dispose();
    islem3.Dispose();
    }
    

    Umarım faydalı olur, zaman zaman günlerce üzerinde uğraştığım, saç baş yonduğum konuları sizlerle tecrüblerim dahilinde paylaşmaya çalıştım. Eğer hatalı bir yer görürseniz lütfen yorum olarak ekleyin, gerekli düzeltmeleri yapayım. Öğrendikçe bu tarz paylaşımlarıma devam edeceğim, kalın sağlıcakla.

MSSQL Tarih Saat Problemi ve Çözümü

Arkadaş işin içine tarih saat girince heryer karışıyor. Belki sadece bana oluyordur ama araştırdığım kadarıyla bu sıkıntıları herkes yaşıyor. Sıkıntıların başında tarihleri karşılaştıramama geliyor. Özellikle 29.01.2009 15:38:39 şeklindeki tarih saat formatındaki verilerde sürekli problem oluşuyor.

Veritabanındaki DateTime veri türündeki bir alana örneğin; DateTime.Now.ToString(“MM.dd.yyyy hh:mm:ss”) şeklinde verileri girdiğimizde, bu formattaki farklı bir tarihle karşılaştırma yapmak istediğimizde sıkıntı çıkıyor. Örnek sql sorgusu Select * from Tablo_Adi Where DateTime_Alan_Adi > ‘”+DateTime.Now.ToString(“MM.dd.yyyy hh:mm:ss”)+”‘ mantıken problem olmaması gerekiyor çünki yazdığımız verileri karşılaştırıyoruz, ama gelin görünki sapıtan bir sorgu.

Çözüm kısmında karşımıza sql in getDate() fonksiyonu çıkıyor.

Öncelikle MSSQL için Date Time fonksyionlarının burada anlatıldığını belirteyim.

İzleyeceğimiz yol gayet basit. Veritabanı işlemlerinde kullanacağımız tüm tarih işlemlerini getDate() ile yapacağız.

Örnek;
Insert into Tablo_Adi (alan_adi) Values (getDate()) — bu şekilde eklediğimiz bir bilgiyi şu şekilde çok sağlıklı bir şekilde karşılaştırabiliriz.

Select * From Tablo_Adi Where alan_adi > getDate() — gördüğünüz gibi değişkenler veya programlama dilimizin tarih saat fonksiyonlarını bir kenara koyup bu işler için sql in kendisini kullanıyoruz. Esasında en mantıklısıda bu, neden bu zaman kadar bunu düşünemedim bilmiyorum. Aklıma gelmişken yukarıda verdiğim Date Time fonksiyonlarını incelerseniz tarih işlemleri için hertürlü dönüşümü yapabilirsiniz.

Örnek;
getDate()
bize böyle bir çıktı veriyor = 29.01.2009 15:00:00
DATEADD(day, 10,getDate())
dediğimizde gün sayısına 10 ekliyoruz, eğer day yerine hh yazsaydık saati 10 saat ileri alacaktık = 02.02.2009 15:00:00
DATEPART(yy,getDate())
şeklinde sadece yılı alırız = 2009

Aşağıdaki tabloda yukarıdaki örneklerdeki kısaltmaların açıklamaları bulunuyor.

Açıklama Kısaltmalar
Yıl yy, yyyy
Çeyrek qq, q
Ay mm, m
Yılın Günü dy, y
Gün dd, d
Hafta wk, ww
Haftanın Günü dw
Saat hh
Dakika mi, n
Saniye ss, s
Milisaniye ms

SQL ile sıkça sorulan fonksiyonlar (Bölüm 1)

Select TOP 10 * From TABLOADI Order By ID DESC
Select Gruplanacak_AlanAdi From TABLOADI Group By Gruplanacak_AlanAdi
Select Sum(BirinciAlan-IkinciAlan) as 'Sonuc' From TABLOADI
Select Max(AlanAdi) as 'EnBuyuk' From TABLOADI
Select * From TABLOADI Order By NEWID()


1-
En son 10 kaydı listeler
2- Gruplanacak_AlanAdi içindeki verilere göre gruplama işlemi yapar.
3- BirinciAlan dan IkinciAlan ı çıkarıp sonucu Sonuc alanında gösterir.
4- Belirtilen alandaki en büyük değeri bulup EnBuyuk alanında sonucu görüntüler.
5- Bilgileri rastgele çağırmak için kullanılır. Eğer rastgele 5 veri çekmek istersek Select TOP 5 * From… dememiz yeterli olacaktır.
Denemeden yazdığım için ufak tefek syntax (bir nevi yazım yanlışı) hataları olabilir. Bildirirseniz sevinirim. Kolay gelsin..