Recent comments

None


İçerik Ara











Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2013
Takvim
<<  Ekim 2017  >>
PaSaÇaPeCuCuPa
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
Keywords

turgay , 29. Ağustos 2009, 13:43

Merhaba arkadaşlar,

Bu yazımda SQL Server da ki TOP kullanımı SQL Server 2000 ve sonraki versiyonlar için karşılaştırmalı olarak anlatacağım.

TOP ın hangi amaçla kullanıldığını bilmeyenler için tekrar etmekte fayda var. TOP belirli bir sql sorgusunun ilk belli sayıdaki kaydını almaya yarar. Kullanımı

Select TOP 10 * from Sales.SalesOrderHeader

şeklindedir. Bu bize Sales.SalesOrderHeader table ında ki ilk 10 kayıdı getirmekte.

TOP ifadesini belli bir rakam ya da yüzde olarak kullanabilmekteyiz. Rakamsal kullanımı yukarıda gördük. Oransal kullanım ise şu şekilde;

Select TOP 10 PERCENT * from Sales.SalesOrderHeader

Bu sorgu bize Sales.SalesOrderHeader table ındaki toplam kayıdın ilk %10 luk kısmını getirmekte.

SQL Server 2000 ve önceki versiyonlarında rakam veya yüzdeyi direk vermek zorundaydık. Yani top ifadesinde bir değişken ya da subquery kullanamamaktaydık. SQL Server 2005 ile beraber bu tarz kullanımlarda uygun hale gelmiştir.

Tek dikkat edilmesi gereken nokta belirli bir rakam için bigint değer yüzdesel kullanım için ise float değer kullanmamız gerekmekte.

Değişken kullanımına örnek;

declare @top bigint=15
select top (@top) * from Sales.SalesOrderHeader

Subquery kullanımına örnek;

SELECT TOP (Select COUNT(*) from Sales.SalesPerson) *
FROM Sales.SalesOrderHeader

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Merhaba arkadaşlar,

Bu yazımda SQL Server 2008 de Common Table Expressions kullanımından bahsedeceğim.

Common Table Expressions basit olarak result set döndüren bir query i temporary olarak alıp daha sonra from clause unda kullanmaya yarar. Daha önceleri temp table declare ederek yaptığımız işlemi Common Table Expressions ile rahatça yapabilmekteyiz.

Basitçe syntax ı şu şekildedir;

WITH <name of your CTE>(<column names>)
AS
(
<actual query>
)
SELECT * FROM <name of your CTE>

Bir örnek vererek daha anlaşılır hale getirelim. Örnekleri AdventureWorks2008 database i üzerinde yapacağız.

İlk örneğimiz person.person table ına select çekmek olsun. Bunu CTE kullanarak yapalım.

WITH myPerson
AS
(
Select * from Person.Person
)
Select FirstName,LastName from myPerson

Veri ile doldurduğumuz CTE yi join olarak kullanabiliriz.

WITH OrderCountCTE(SalesPersonID, OrderCount)
AS
(
SELECT SalesPersonID, COUNT(*)
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
GROUP BY SalesPersonID
)

SELECT
sp.BusinessEntityID,
FirstName + ' ' + LastName as SalesPerson,
oc.OrderCount,
sp.SalesYTD
FROM Sales.vSalesPerson AS sp
INNER JOIN OrderCountCTE AS oc ON oc.SalesPersonID = sp.BusinessEntityID
ORDER BY oc.OrderCount DESC

CTE yi self join olarakta kullanmamız mümkün. Şöyle bir senerya düşünelim.

Aşağıdaki gibi bir table ımız olsun ve birden fazla geçen ürün adlarından ilklerini almayarak bir sorgu sonucu almak isteyelim.

CREATE TABLE MyProducts
(ProductID int NOT NULL,
ProductName varchar(25),
Price money NULL,
CONSTRAINT PK_Products PRIMARY KEY NONCLUSTERED (ProductID)
)
GO

INSERT INTO Products VALUES (1, 'Widgets', 25)
INSERT INTO Products VALUES (2, 'Gadgets', 50)
INSERT INTO Products VALUES (3, 'Thingies', 75)
INSERT INTO Products VALUES (4, 'Whoozits', 90)
INSERT INTO Products VALUES (5, 'Whatzits', 5)
INSERT INTO Products VALUES (6, 'Gizmos', 15)
INSERT INTO Products VALUES (7, 'Widgets', 24)
INSERT INTO Products VALUES (8, 'Gizmos', 36)
INSERT INTO Products VALUES (9, 'Gizmos', 36)

Bunun için aşağıdaki CTE query sini kullanabiliriz.

WITH MinProductRecords AS
(
SELECT MIN(ProductID) AS ProductID, ProductName
FROM Products
GROUP BY ProductName
HAVING COUNT(*) > 1
)

SELECT P.*
FROM Products AS P
INNER JOIN MinProductRecords AS MP
ON P.ProductName = MP.ProductName AND P.ProductID > MP.ProductID

Bu bize eski sistem olan table ı self join olarak bağlamaya nazaran ekstra bir performans sunmamakta. Ama daha derli toplu bir kod görüntüsü sağlamaktadır.

Son olarakta CTE ile recursive fonksiyonların nasıl yapıldığını görelim. Bu işlem içinde aşağıdaki gibi bir table ımız olsun.

CREATE TABLE MyEmployeeTree
(EmployeeID int PRIMARY KEY,
EmployeeName nvarchar(50),
ReportsTo int)
GO

INSERT INTO MyEmployeeTree VALUES(1, 'Richard', NULL)
INSERT INTO MyEmployeeTree VALUES(2, 'Stephen', 1)
INSERT INTO MyEmployeeTree VALUES(3, 'Clemens', 2)
INSERT INTO MyEmployeeTree VALUES(4, 'Malek', 2)
INSERT INTO MyEmployeeTree VALUES(5, 'Goksin', 4)
INSERT INTO MyEmployeeTree VALUES(6, 'Kimberly', 1)
INSERT INTO MyEmployeeTree VALUES(7, 'Ramesh', 5)

Şöyle bir sonuç almak isteyelim. Stephen ve Stephen e rapor veren tüm elemanlar ile bu elemanlara rapor veren tüm elemanları alalım. Yazmamız gereken CTE query si aşağıdaki olmalıdır.

WITH SimpleRecursive (EmployeeID,EmployeeName,ReportsTo)
AS
(
SELECT EmployeeID,EmployeeName,ReportsTo FROM MyEmployeeTree WHERE EmployeeID=2
UNION ALL
SELECT met.EmployeeID,met.EmployeeName,met.ReportsTo FROM MyEmployeeTree met
INNER JOIN SimpleRecursive sr ON sr.EmployeeID=met.ReportsTo
)

SELECT sr.EmployeeName as Employee,met.EmployeeName as Boss 
from SimpleRecursive sr
INNER JOIN MyEmployeeTree met ON met.EmployeeID=sr.ReportsTo

Recursive fonksiyonlarda OPTION(MAXRECURSION 25) ile maksimum recursive sayısını verebilirsiniz.

Burdaki 25 rakamı 25 defa dönebilir manasına gelmekte.

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Merhaba arkadaşlar

Bu yazımda SQL Server 2008 de ki Policy Management kavramından bahsedeceğim.

Policy Management Sql Server 2008 ile beraber gelen yeni bir özellik. Hazırlanan policy ler sayesinde örneğin bir veritabanı create edilirken auto shrink özelliğinin kontrol edilmesi ve bizim belirlediğimiz değilse hata verilmesi sağlanabilir. Yada table create edilirken girilen table adı policy e uygun mu, yada table create edilirken index e sahip olsun mu olmasın mı tarzında policy ler tanımlayabiliriz.

Policy Management Menüsüne SQL Server Management Studio (SSMS) da Management ın altından erişebiliriz.

 

 

 

İlk incelememiz gereken yer facets. Facets, sql server kurulumuyla beraber gelen yönetilebilen özelliklerdir. Mesela bu bölümdeki database facet ına çift tıklarsak açılan pencerede database için verebileceğimiz özellikleri görmekteyiz.



 

Şimdi sırasıyla bir policy oluşturmanın adımlarına bakalım.

  • Condition oluştur
  • Policy oluştur
  • Policy i kontrol et.

 

Condition Oluşturmak

Örneğin table adı için bir policy yapalım. Bu policy table adı “tbl_” ile mi başlıyor diye kontrol etsin. İlk olarak bir condition oluşturmalıyız. Bunun için menüden condition a sağ tıklayıp new condition diyoruz.




Name kısmına condition için bir ad giriyoruz. Daha sonra facet kısmından table ı seçiyoruz. Çünkü table adını kontrol edeceğiz. Expression kısmında ki field kısmından @name seçeneğini seçip operator ü like yapıyoruz. Çünkü belirli bir ifade ile başlayıp başlamadığını kontrol edeceğiz. Son olarak ta value kısmına kontrolümüz olan ‘tbl_%’ yi yazıp ok e basıyoruz.

 

Policy Oluşturmak

Management Studio da policy e sağ tıklayıp new policy diyoruz. Açılan pencerede policy a bir isim veriyoruz.  Check condition kısmından az önce yaptığımız condition ı seçiyoruz. Şu an için bu condition bütün table lar ve bütün database için geçerli olacaktır. Eğer bunu değiştirmek istiyorsak every yazılarının yanındaki ok tuşlarına basarak onlar içinde condition lar tanımlayabiliriz.




Evaluation Mode kısmında 4 seçenek göreceksiniz. Bunlar;

  • On Demand (Default Seçenek) = Bu seçimi yaparsanız eğer policy in kontrolünü management studio da policy e sağ tıklayıp evaluate seçeneğini seçtiğinizde gelen ekranda yapabilirsiniz.
  • On Schedule : Policy için bir iş emri tanımlayabilirsiniz. Bunun için hazır tanımlanmış iş emri seçebileceğiniz gibi kendiniz istediğiniz bir süreyi de seçebilirsiniz.
  • On Change – Log Only : Bu seçenek vasıtasıyla koşul sağlanmadığı anda otomatikman Windows Event Log a bununla alakalı bilgi düşmekte.
  • On Change – Prevent : Bu seçenek vasıtasıyla örneğin daha table ı create ederken hata mesajı almanız mümkün. SQL ile table Create komutu uygulandığında sistem size bir uyarı mesajı verecektir.


On Demand seçeneğini seçip Ok e basarak policy e oluşturuyoruz. Bu arada on demand hariç diğer seçeneklerde enable yazısını tiklemeyi unutmayın yoksa policy çalışmaz.

Şimdi oluşturduğumuz bu policy i evaluate edip sistemimizdeki tableların bu policy i sağlayıp sağlamadığına bakalım.

Bunun için management studio da policy ı bulup sağ tıklayıp evaluate diyoruz. Şu tarz bir pencere açılacaktır.

 




Bu ekranda kırmızı ile belirtilen satırlar belirtilen policy i sağlamamakta, yeşil ile belirtilen satırlar ise sağlamaktadır.

Export Result özelliği ile de evaluate sonucunu xml formatında kaydetmemiz mümkün.


İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Merhaba arkadaşlar,

Table-Valued Parameters SQL Server 2008 ile beraber gelen yeni bir parametre tipidir. Table-Valued parameters user-defined table types içerisinde declare edilir. Table-Valued parameters kullanarak Stored Prodecure yada function gibi sql bloklarına birden fazla satırlı bilgi gönderebilirsiniz. Daha önceleri bu işlem temp table yada çoklu parametre yardımı ile yapılabiliyordu.

Şimdi senaryomuza bakalım. Daha önceki işlemlerimizde kullandığımız employee tableına birden fazla kişiyi insert edeceğiz. Bunun için bir stored procedure yazıp çoklu parametre, temp table ve Table-Valued parameters kullanımı inceleyeceğiz.

İlk önce table create için aşağıdaki sql i uygulayabilirsiniz.

CREATE TABLE dbo.Employee(
EmpID int Primary Key NOT NULL,
EmpName nvarchar(100) NOT NULL,
EmpEmail nvarchar(100) NOT NULL)
GO

 

Çoklu parametre kullanarak insert etmek.

Insert işlemini yapacak stored procedure;

CREATE PROCEDURE NewEmployeeMS(@EmpID int,@EmpName nvarchar(100),@EmpEmail nvarchar(100))
As
BEGIN
INSERT INTO dbo.Employee
	values(
	@EmpID, @EmpName, @EmpEmail)
END


Daha sonrada tek tek insert işlemini yapıyoruz.

execute NewEmployeeMS 1,'John McLean','JohnMcLean@contoso.com'
execute NewEmployeeMS 2,'Bob Smith','BobSmith@contoso.com'
execute NewEmployeeMS 3,'Ted Connery','TedConnery@contoso.com'

 

Ve tablomuzdaki verileri görmek istersek

select * from dbo.Employee;

Bu yönetimin eksileri;

  • · Stored procedure 1 den fazla execute edilmek zorunda. Buda performans sorunlarına yol açabilir.
  • · Bu yöntem verimsiz bir kod görüntüsü çizmekte.

Local Temporary tables ile Insert İşlemi

Employee table ındaki verileri silelim.

Truncate table dbo.Employee

Insert işlemini yapacak stored procedure

CREATE PROCEDURE NewEmployeeTempTable
As
BEGIN
INSERT INTO dbo.Employee
SELECT * FROM #EmployeeTempTable
END

Temp table ı create edelim

CREATE TABLE dbo.#EmployeeTempTable(
EmpID int NOT NULL,
EmpName nvarchar(100) NOT NULL,
EmpEmail nvarchar(100) NOT NULL)

Temp table a insert leri yapalım.

INSERT INTO #EmployeeTempTable VALUES(1,'John McLean','JohnMcLean@contoso.com')
INSERT INTO #EmployeeTempTable VALUES(2,'Bob Smith','BobSmith@contoso.com')
INSERT INTO #EmployeeTempTable VALUES(3,'Ted Connery','TedConnery@contoso.com')

Ve son olarakta stored procedure ü çalıştırıp temp table daki verileri employee table ına alalım.

exec dbo.NewEmployeeTempTable

İşlemlerin bitiminde de temp table ı drop edelim.

Drop table dbo.#EmployeeTempTable

Bu yöntemin eksileri ise şu şekilde sıralanabilir.

  • · Temp table lar disk üzerinde create edilmekte dolayısıyla disk I/O arttırmaktadır.
  • · Temp table lar tempdb içerisine create edilirler ve lock ve block durumlarına yatkındırlar.
  • · İşlemler bittikten sonra manuel olarak temp table drop edilmek zorundadır.
  • · Temp table kullanımı sık kullanılan stored procedure lerin tekrar compile olmasına sebebiyet verirler.

Table Valued Parameters Kullanarak Insert İşlemi

Şimdi makalemizin ana konusu olan table valued parameters kullanarak senaryomuzu gerçekleştireceğiz.

İlk olarak employee table ını boşaltalım.

Truncate table dbo.Employee

Daha sonra data type ı create edelim.

CREATE TYPE EmployeeTableType AS TABLE
(EmpID INT, EmpName nvarchar(100), EmpEmail nvarchar(100))

Bu create edilen data type ı Programmability/ Types/User-Defined Table Types kısmında da görebilirsiniz.

Insert işlemini yapacak stored procedure

CREATE PROCEDURE NewEmployee(@EmployeeDetails EmployeeTableType READONLY)
As
BEGIN
INSERT INTO dbo.Employee
SELECT * FROM @EmployeeDetails
END

Gördüğünüz gibi stored procedure e parametre olarak bizim oluşturduğumuz table type tipinden değişken gönderiyoruz. Bu arada readonly yazısı dikkatinizi çekmiştir. Table-valued parameter leri sql bloklarına readonly olarak gönderilmek zorunda. Ve bu değişkenler üzerinde update-delete yada insert işlemleri yapılamamaktadır.

Aşağıdaki sql bloğuyla da insert işlemini yapalım.

DECLARE @NewEmployees EmployeeTableType
INSERT INTO @NewEmployees
VALUES(1,'John McLean','JohnMcLean@contoso.com')
INSERT INTO @NewEmployees
VALUES(2,'Bob Smith','BobSmith@contoso.com')
INSERT INTO @NewEmployees
VALUES(3,'Ted Connery','TedConnery@contoso.com')
EXECUTE NewEmployee @NewEmployees

Bu sql komutundan sonra @NewEmployees değişkeni artık sistemde bulunmamaktadır.

İşlemlerimiz bu kadar. Şimdi table valued parameters kullanımının faydalarına bakalım.

  • · Table valued parameters daha esnek bir kullanım sağlamakta ve temp tables veya diğer yöntemlere göre daha iyi performans getirmektedir.
  • · Tanımlanan table valued değişkenler sql komutundan sonra otomatikman silinmektedir.
  • · Herhangi bir lock işlemi açısından oldukça sağlıklıdır.
  • · Stored procedure yada function ın tekrar tekrar compile olmasına sebebiyet vermez.
  • · Verimli ve kolay anlaşılabilir bir kod görüntüsü çizmektedir.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Merhaba arkadaşlar,

Sql Server 2008 ile gelen bir diğer özellik Change Data Capture. Bu özellik ile bir table üzerinde yapılan insert,update ve delete işlemlerinin logunu tutabilmekteyiz. Bu özelliği tablo bazında yada tablonun istediğimiz alanları bazında yapabilmekteyiz.

Şimdi bunu nasıl yapabildiğimize bakalım.

Örneğin aşağıdaki gibi bir table üzerinde çalıştığımızı düşünelim. Table ın oluşması için aşağıdaki sorguyu çalıştırabilirsiniz.

CREATE TABLE dbo.Employee(

EmpID int Primary Key NOT NULL,

EmpName nvarchar(100) NOT NULL,

EmpEmail nvarchar(100) NOT NULL)

GO

Daha sonra database in Change Data Capture özelliğini enable etmemiz gerekiyor. Bunun için uygulamamız gereken komut;

EXEC sp_cdc_enable_db

Şimdide bizim table ımızın Change Data Capture özelliğini enable etmemiz gerekiyor. Bunun içinde aşağıda ki sorguyu uygulamamız gerekiyor;

EXEC sp_cdc_enable_table

@source_schema = N'dbo',

@source_name = N'Employee',

@role_name = NULL,

@filegroup_name = N'',

@supports_net_changes = 1

Enable işlemlerimiz tamam. Şu anda employee table ında bir insert update yada delete işlemi yaparsak bu işlem loglanacak.

İlk işlemi yapalım;

INSERT INTO dbo.Employee

values (1, N'Ahmet Sahtiyan', N'turgay@turgaysahtiyan.com')

Daha sonra bu kayıdı update edelim.

UPDATE dbo.Employee SET EmpName = N'Turgay Sahtiyan' WHERE EmpID = 1;

Şimdi loglanan kayıtlara bir bakalım. Bu kayıtlar cdc.dbo_Employee_CT table ında tutulmaktadır. Change Data capture özelliği enable edilen her kayıt için log bilgileri <schema>_<table>_CT formatındaki table larda saklanmaktadır.

Employee table ı için loglanan kayıtları görebilmek için select * from cdc.dbo_Employee_CT sorgusunu çalıştırdığımızda 3 kayıt göreceğiz. Bunların ilki insert işlemi. 2. si update işlemi, son kayıt ise update işleminden sonraki kayıtın durumunu vermekte.

Yani operation kolonunda değer 1 ise delete, 2 ise insert,3 ise update ten önceki kayıt,4 ise update ten sonraki kayıtın durumunu vermekte.Select işlemi ise loglanmamaktadır.

Şimdi aşağıdaki sorguyu çalıştıralım.

DECLARE @from_lsn binary(10), @to_lsn binary(10);

SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_employee');

SET @to_lsn = sys.fn_cdc_get_max_lsn();

SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_employee(@from_lsn, @to_lsn, 'all');

Bu sorgu ile 2 kayıt dönecektir. İlki insert işlemi, 2.si ise update işleminden sonraki kayıtın durumu. Filtre olarak kullanılan ‘all’ dikkatinizi çekmiştir. Bu özellik bütün değişiklikleri getirmekte.Fakat update işlemleri için sadece updateten sonraki kayıtı getirmekte. Eğer update işleminden önceki kayıtıda görmek istiyorsak ‘all’ yerine 'all update old’ filtresini kullanmamız gerekmekte.

fn_cdc_get_min_lsn sistem fonksiyonu belirtilen tablonun minimum lsn değerini almaya yarar. Aynı şekilde fn_cdc_get_max_lsn fonksiyonuda maksimum lsn değerini almaya yarar.

Şimdi aşağıdaki sorguyu çalıştıralım.

DECLARE @from_lsn binary(10), @to_lsn binary(10);

SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_employee');

SET @to_lsn = sys.fn_cdc_get_max_lsn();

SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_employee(@from_lsn, @to_lsn, 'all');

Bu sorguda fn_cdc_get_all_changes_dbo_employee fonksiyonu yerine fn_cdc_get_net_changes_dbo_employee fonksiyonu kullanılmıştır. Bu fonksiyon vasıtası ilede kayıdın en güncel halini almaktayız.

Aşağıdaki sorgu ile log tableını temizleyebiliriz.

DECLARE @end_time datetime;

DECLARE @to_lsn binary(10);

SET @end_time = GETDATE();

SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);

exec sys.sp_cdc_cleanup_change_table @capture_instance = 'dbo_employee', @low_water_mark=@to_lsn

sp_cdc_cleanup_change_table belirlenen tabloda ki kayıtları @low_water_mark değerine göre temizlemekte.

İstediğimiz anda Change Data Capture işlemini disable edip loglama işlemini sonlandırabiliriz. Bunun için uygulayabileceğimiz sorgu aşağıdaki gibidir.

EXECUTE sp_cdc_disable_table

@source_schema = N'dbo',

@source_name = N'Employee',

@capture_instance = N'dbo_Employee'

İyi çalışmalar,

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Merhaba arkadaşlar,

Bu yazımda Sql Server 2008 de bulunan Date ve Time veri tiplerini, farklılıklarını ve bazı datetime fonksiyonlarını inceleyeceğiz.

Sql server 2008 ile birlikte Date,Time,DateTime2 gibi yeni veri tipleri gelmekte. Sql Server da bulunan tüm date ve time veri tiplerini görüntülemek için aşağıdaki sql i çalıştırılalım.

select * from sys.systypes where name like '%date%' or name like '%time%'

Bu veri tiplerini kısaca anlatacak olursak;

Date=Tarih tipinden veri saklamaya yarar.01-01-0001 ile 31-12-9999 arasında herhangi bir değeri alabilir.

Time=Saat türünden veri saklamaya yarar. Nano saniye bölümü 7 digitten oluşmaktadır. Burada ek bir bilgi vermem gerekirse; tablo oluştururken time tipinden bir veri tipi seçip nano saniye kısmı için digit ayarlaması yapabilmekteyiz. Time(7) tanımlamasındaki 7 rakamı bize hassasiyeti vermekte. Biz bunu sql server 2000 de olduğu gibi 3 yapabilmekteyiz.

DateTime=Tarih ve saat tipinden veri saklamaya yarar. 01-01-1753 ile 31-12-9999 arasında bir değer alabilir. Aynı zamanda nanosaniye olarak 3 digit i desteklemektedir.

DateTime2= DateTime veri tipinin aynısıdır. Farkı range olarak 01-01-0001 , 31-12-9999 aralığını desteklemesidir. Bir diğer farkıda nanosaniye olarak 7 digit i desteklemektedir.

SmallDateTime = DateTime veri tipinin daha az kapsamlı halidir. Nano saniye bilgisi içermez ve range olarak 01-01-1900 ile 06-06-2079 aralığını destekler.

DateTimeOffSet = İçerisinde UTC bilgisi de olan Tarih-Saat veri tipidir. Örneğin Select SYSDATETIMEOFFSET() sorgusunu çalıştırırsak UTC bilgisi içeren şu sonucu alırız. 2009-08-10 16:26:53.7895439 +03:00

Veri tiplerini karşılaştırmalı olarak şu tablodan inceleyebilirsiniz;

den1

 

Date – Time Fonksiyonları

Sql server 2008 öncesinde date time değerlerini almak için 2 tane fonksiyon vardı. Bunlar GETDATE ve GETUTCDATE fonksiyonları. Sql server 2008 ile beraber 3 yeni fonksiyon daha gelmekte. Bunlar SYSDATETIME, SYSUTCDATETIME ve SYSDATETIMEOFFSET fonksiyonları. Bu fonksiyonlardan SYSDATETIME ve SYSUTCDATETIME, GETDATE ve GETUTCDATE fonksiyonlarının yaptığı işin aynısını yapmakta. Tek farkları nanosaniye kısmındaki 7 digiti destekler yapıları. SYSDATETIMEOFFSET ise bize tarih-saat bilgisinin yanında UTC zaman farkınıda vermekte.

Bu 5 fonksiyon arasındaki farkları görmek için aşağıdaki sorguyu çalıştırabilirsiniz.

select GETDATE(), GETUTCDATE(), SYSDATETIME(), SYSDATETIME(), SYSDATETIMEOFFSET(), SYSUTCDATETIME()

Bir diğer SQL Server 2008 yeniliği olarak datepart fonksiyonuna TZoffset parametresi gelmekte. Biliyorsunuz datepart fonksiyonu ile bir datetime değişkeninin istediğimiz parçasını alabilmekteyiz. TZoffset parametresi ise verilen datetime değişkeninin UTC zaman farkı değerini dakika olarak vermekte. Örneğin Türkiye için konuşursak

select datepart(TZoffset,sysdatetimeoffset())

sorgusu bize 180 değerini verecektir.

Bir diğer fonksiyon ise SWITCHOFFSET fonksiyonu. Bu fonksiyon ile de bir datetime değerinin UTC değerini değiştirebilmekteyiz.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan