C# Tarih Fonksiyonları



Merhabalar aslında bu makaleyi yazarken amacım hangisi nedir yerine bu metodların ihtiyaç durumlarına göre kullanımlarına  örnekler vermekti. Ama konu o kadar geniş ki bunu daha sonra ki bir zamana erteleme kararı aldım. Ee başlamışken birşeyler anlatarak konuya girmiş olalım.

DateTime dt = DateTime.Now;
DateTime dt2=new DateTime(2011,1,1);

İki tarih arasında ki farkı bulmak:
İki tarihideki fark Subtract() metoduyla bulunur ve TimeSpan tipinden değer döndürür.

TimeSpan tSpan = dt.Subtract(dt2);

İsterseniz TimeSpan olarak dönen değerle şimdi neler yapabiliriz inceleyelim.
Aşagıdaki örneklerde farkı gün saat gibi int tipinden alabildiğimizi görüyoruz.

tSpan.Days;
tSpan.Hours;
tSpan.Minutes;
tSpan.Seconds;

belli başlı özellikleri ele aldık eğer inceleresenizdaha fazlası oldugunu göreceksiniz.

Tarihin belli bölümlerini alabiliriz.

dt.Day; Tarihin gün değerini int tipinden döndürür
dt.Month; Tarihin ay değerini int tipinden döndürür.
dt.Year; Tarihin yıl değerini int tipinden döndürür.

Saat dakika saniye cinsinden properties lerin oldugunu artık söylemeye gerek yok sanırım.

Tarih ekleme çıkarma:

dt.AddDays(1); Güne 1 ekledik
dt.AddDays(-1); Gün degerini 1 eksilttik yani düne gittik
dt.AddHours(1); Saate 1 ekledik
dt.AddHours(-1); Saati 1 eksilttik
Ay, yıl, dakika, saniye gibi işlemleri kendiniz deneyebilisiniz.
Sizde fakedeceksiniz ama yinede değinmeden geçmiş olamayalım. Saniye, dakika, gün gibi özeliklere yapılan ekleme ve çıkarmalar direk olarak eğer gün ise tarihin yıl kısmınıda etkileyecektir. Yani 31.12.2010 tarihine 1 gün eklerseniz 01.01.2011 tarihine dönecektir. Aynısı dakika, saat gibi özellikler içinde geçerlidir.

Tarih Formatlama :

Zaman zaman tarihleri farklı formatlarda almak isteriz. Şimdi bunu nasıl yapabiliriz inceleyelim. Uygulanan formatlar ve döndürdükleri string degerler aşağıda yanyana gösterilmekte.

dt.ToString("t");  23:29
dt.ToString("r");  Wed, 04 May 2011 23:29:09 GMT
dt.ToString("T");  23:28:30
dt.ToString("m"); 04 Mayıs
dt.ToString("G");  04.05.2011 23:26:10
dt.ToString("g");  04.05.2011 23:25
dt.ToString("F");  04 Mayıs 2011 Çarşamba 23:24:42
dt.ToString("f");  04 Mayıs 2011 Çarşamba 23:24
dt.ToString("D");  04 Mayıs 2011 Çarşamba
dt.ToString("d");  04.05.2011
dt.ToString("yyyy.MM.dd"); 2011.05.04

Yukarıda uygulanan formatların tamamı String.Format() yönteminde de aynen kullanılabilir.
String.Format("{0:m}", dt); 04 Mayıs

dt.ToLongDateString(); 04 Mayıs 2011 Çarşamba
dt.ToShortTimeString(); 23:19
dt.ToShortDateString(); 04.05.2011
dt.ToString(); 04.05.2011 23:17:08

Başta da dediğim gibi geniş bir konu. İhtiyaça göre bu anlatılan özellikler birçok faklı şekilde kullanılabilir.
Başlangıç için umarım faydalı olmuştur.

Sql Pivot

Merhabalar bu kez sql de az bilinen bir operatörü yani Pivot komutunu incelecegiz.

Pivot komutu Oracle ve Ms Sql gibi SQL tabanlı databaselerin hepsinde vardır.
Normalizasyon kurallarında içinde tasarlanmış tablolar olap şeklinde sorgulamalara izin vermeyebilir. Bu tür durumlar devreye pivot sorgulama girer ve detaylı analiz imakanı verir.

Pivot kısaca ne yapar ?? Tablo da yapısı geregi alt alta sıralanmış olan kayıları yanyana yani sütunlar şeklinde göstermeye yarar.

Sorgu yazmaya başlamadan önce bir konuda sizi uyarmak isterim. Database üzerine pivot sorgu uyğulayabilmek için bir tane prosedürü çalıştırmanız gerekiyor.

sp_dbcmptlevel 'veritabanı_Adı, '90'İsterseniz Prosedürü çalıştırmadan önce isterseniz sorguyu uygulayın nasıl tepki vereceğini, hangi hatayı döndüreceğini görün. Bu size ilerde konuyla ilgili hata çözümünde yardımcı olacaktır.

İsterseniz şimdi sorgumuzu yazalım.

SELECT *
FROM (
SELECT
YEAR(TARIH) [Yıl],
MONTH(TARIH) [Ay],
TOPLAM
FROM SATIS
) TableDate
PIVOT (
SUM (TOPLAM)
FOR [AY] IN (
[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]
)
) PivotTable


Sorgumuzu yazdık şimdi kısaca açıklayalım.
Satır halinde olan satışları listeler. Satış tarihini ay ve yıl olarak ayırdık. Pivot kısmında da Toplam alanını topladık ve toplamları aylara bölerek gösterdik.

Konuyu biraz araştırırsanız bu işlemin tersini uygulayan UnPivot komutunuda kolayca kavrarsınız.

Artık istedigimiz zaman OLAP mantıgında sorgular çekebilir kullanıcılara daha okunur daha ayrıntılı raporlar sunabilirsiniz.

Umarım faydalı olmuştur.

Using Kullanımı ve Otomatik Dispose()

Merhaba;
Bu makalemizde Using ifadesi kullanımı, nasıl çalıştığını ve bellek yönetimine katkısını incelemeye çalışacagız.

Yazılımda performans ve bellek yönetiminin önemini biliyoruz. Küçük çaplı projelerde .Net CLR (Common Language RunTime) sayesinde kodları çalıştırmak
ve bellek yönetimini otomatik olarak yapma görevini üstlensede büyük çaplı, verilerin yoğun aktığı bir projede bellek yönetimini mümkün olduğu kadar elimizde tutmamız gerekir. CLR de bu görevi GC (Garbage Collector) mekanızması sayesinde yerine getirmektedir.

Bilindiği gibi kod tarafında oluşturulan referans tipler için bellekte heap bölgesinde alan tahsis edilir ve işi bittikden sonra bellekten atılırlar ama bellekten atılma süreleri belirsizdir.

Belirsiz dedik çünkü GC nin ne zaman çalışacağı belli değildir. (Kendi içinde mutlaka bir mekanizmaya bağlıdır.)

Direk şu fikir akla gelebilir ozaman bizde GC yi görev başına çagırırız! Evet bu da bir yöntem ama sadece gerçekten gerektiğinde kullanılması gerekir. Çünkü sık sık GC kullanmak performans kaybına neden olur.

Ayrıca oluşturulan nesnelere null değeri atamak o nesneyi bellekten atmaz sadece üzeri kapatılarak erişilmez hale getirir ama arka tarafta bellek alanında var olmaya devam eder.

Ozaman ne yapılmalı ?
IDispose arayüzünden implemente edilmiş Dispose() metodu kullanmalı.

Kullandığımız bir çok nesne Dispose() metoduna sahiptir ve tamamıda IDispose interface inde kalıtım yoluyla geçmiştir.

İsterseniz şimdi kısa bi örnek ile ilerleyelim.

SqlConnection sqlCon = null;
SqlDataAdapter adp = null;
try
{
sqlCon = new SqlConnection("Server=.;Database=AdventureWorks;Uid=sa;Pwd=1234");
adp = new SqlDataAdapter("Select * From Production.Product", sqlCon);
adp.Fill(dt);
}
catch (Exception ex)
{
throw new Exception ("hata", ex);
}
finally
{
sqlCon.Close();
adp.Dispose();
sqlCon.Dispose();
}

Görüldüğü gibi finally blogu her durumda çalışağı için SqlDataAdapter ve SqlConnection nesneleri Dispose işlemine tabi tutulmuşlardır.

Buraya kadar anladık ama using bunun neresinde diyebilirsiniz. Şimdi sıra bunun cevabını vermeye geldi.

using anahtarı uyğuladıgınız sınıflarda otomatik olarak dispose çalıştırır.
Yani bunun anlamı finaly blogunda ayrıca adp.Dispose(); şeklinde metoduğu çagırmanıza gerek kalmaz using bizim için bunu yapar demektir.

usin ifadesi nesnenin yaşam sürecini belirtir.

using(SqlCommand cmd=new SqlCommand("Select * From Production.Product", sqlCon))
{
// işlenen komutlar
// SqlCommand yaşam alanı
}

Örnekte bakacak olursak SqlCommand yaşam alanı { } arasında son bulacaktır. Otomatik olarak Dipose() uygulanmış olur.

Çok kullanıcılı bir programda bunun ne kadar önemli oldugunu tahmin edersiniz.

Sizlerde geliştirdiğiniz sınıflara aşagıda ki örnegi uygulayarak usin ifadesiyle otomatik dispose a tabi tutabilirsiniz.

class MyClass:IDisposable
{

public void Dispose()
{
//Dispose kodlarınız...
GC.SuppressFinalize(this);
}
}


Umarım faydalı olmuştur...

Sql String Fonksiyonları

Merhabalar bu makalemizde sıkca kullandığımız Ms Sql string ifadeleri bir araya toplayarak
ne işe yaradıklarını birer örnekle kısaca anlatmak istedim.

Sql tarafında işleri ne kadar iyi çözümlersek yazılım dilleri trafında kodlar o kadar sadeleşiyor ve olası basit değişiklikler söz konusu olduğunda maliyeti oldukca düşürüyor.

LEFT String ifadeden soldan verilen sayı kadarını gösterir.
SELECT LEFT('ŞEBNEM FERAH',3)
Sonuç:ŞEB

RIGHT Stringten sağdan verilen sayı kadarını gösterir.
SELECT RIGHT('ŞEBNEM FERAH',5)
Sonuç:FERAH

LEN Verilen stringin karakter sayısını döndürür. Buna boşluk karakteride dahildir.
SELECT LEN('ŞEBNEM FERAH')
Sonuç:12

UPPER Küçük harfli verilen stringi büyük harflere çevirir.
SELECT UPPER('fatih')
Sonuc: FATİH

LOWER Büyük harfli verilen stringi küçük harflere çevirir.
SELECT LOWER('FATİH')
Sonuç: Fatih

SUBSTRING Verilen stringten parça almak için kullanılır.
Örnekte verilen parametrelere göre 2 den başlayrak 3 tane karakter al demiş olduk.
SELECT SUBSTRING('FATİH',2,3)
Sonuç: ATİ

REPLACE Verilen karakterleri biribiriyle değiştirir.
Örnekte MAKİNİST kelimelerini PİLOT olarak değiştir dedimiş olduk.
SELECT REPLACE('MAKİNİST AHMET','MAKİNİST','PİLOT')
Sonuç:PİLOT AHMET

STUFF 4 paremetre olarak çalışan bu fonksiyon replace fonksiyonu gibi çalışır ama fark olarak karakter olarak değil verilen indexlere göre değiştirme yapar.
SELECT STUFF('Audi hh',5,3,'TT')
Sonuç:AudiTT

LTRIM Soldan boşlukları alır.
SELECT LTRIM(' RAMBO')
Sonuç:RAMBO

RTRIM Sağdan boşlukları alır.
SELECT RTRIM('RAMBO ')
Sonuç:RAMBO

REVERSE stringi ters çevirir.
SELECT REVERSE('RAMBO')
Sonuç:OBMAR

QUOTENAME Verilen string ifadeyi köşeli parantez [] içine almayı sağlar.
SELECT QUOTENAME ('SELECT')
Sonuç:[SELECT]

REPLICATE Verilen string ifadeyi parametre geçilen sayı kadar tekrarlar.
SELECT REPLICATE('0',10)
Sonuç:0000000000

Faydalı olması umuduyla...

SQL Procedure ile Excel den Sql e Aktarımı

Arkadaşlar bu makalemizde SQL Proc ile excel den sql e SQL veri aktarımını incelicez.

Bir çok konuda oldugu gibi bu konuda da bi kaç farklı yöntem uygulanabilir.
Benim ihtiyacım olduduğunda kullandığım yöntemi sizinle paylaşmak istedim.

OPENROWSET teknigini kullanmak için sql serverinizde ikitane servisin aktif halde olması gerekiyor bunlar 'show advanced options' ve 'Ad Hoc Distributed Queries' servisleridir.

Aşagıda gördüğünüz komutları sql çalıştırırak yada Menüden SQL SERVER 2005/Configration Tools altından resimde gödüğünüz gibi tik işaretli olması gerekiyor.



sp_configure 'show advanced options', 1
reconfigure
go
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure

Ayarlarımızı yaptıktan sonra sıra geldi proceduremizi yazamaya.

CREATE PROC XLS_AKTARIM
ASDECLARE @KOMUT NVARCHAR(500)
SET @KOMUT='SELECT * INTO Sayfa1$ FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0;Database=C:\test.xls'', [Sayfa1$])'
EXEC( @KOMUT)

Sonuç olarak açıklamamız gerekirse ;
OPENROWSET yöntemini kullanarak Microsoft.Jet.OLEDB.4.0 araçılıgıyla C:\test.xls yolunda ki excele bağlandık ve sanki tabloymuş gibi Sayfa1 deki verileri okuduk.
Select Into ile Sayfa1$ isminde bir tablo oluşturup içine aktardık.

Burda;
Yöntemimiz: OPENROWSET
Sağlayıcımız :Microsoft.Jet.OLEDB.4.0 (Diğer versiyonlar için değişebilir ben office 2003 kullandım.)
Excel versiyonu: Excel 8.0 (Diğer versiyonlar için değişir uygun olanına bakın)
Kaynak Sayfa : [Sayfa1$] (Diğer sayfalar için [Sayfa2$]... olarak değişir)
Hedef Oluşacak Tablo : Sayfa1$ (Siz istediğiniz ismi verebilirsiniz. Ancak veritabanında bu isim varsa zaten kullanımda diye hata verecektir.)

Siz bunu biraz daha geliştirip excel yolunu ve sayfa isimlerini parametre olarak yollayıp daha kullanışlı bir hale getirebilirsiniz.
Konunun sade kalabilmesi için ben o kısmına girmedim.

Umarım faydalı olmuştur.