SQL DateTime Fonksiyonlarının Kullanımı

SQL DateTime Fonksiyonları, SQL’de en çok kullanacağımız fonksiyonlardan bazılarıda datetime fonksiyonlarıdır kimi zaman yaş, ay, yıl, gün veya tarih ekleme çıkarma gibi işlemlere ihtiyaç duyarız SQL tarafında bu ihtiyaçlarımızı DateTime Fonksiyonları karşılamaktadır.

SQL DateTime Fonksiyonlarının Kullanımı

SQL DateTime Fonksiyonlarının Kullanımı

Sql Server DateTime(Tarih Saat) Fonksiyonları

FonksiyonAçıklama
1GETDATE()Sistemin o anki tarih ve saatini verir. Ayrıca sistemin o anki tarih ve saatini CURRENT_TIMESTAMP ilede alabilirsiniz. GETDATE() fonksiyonu sybase’den devranılan ve SQL Server’a özgü bir fonksiyondur ama CURRENT_TIMESTAMP ANSI SQL standardıdır sql server içerisinde rahatlıkla ikisinide kullanabilirsiniz.
2DATEDIFF()İki tarih arasındaki farkı gösterir
3DATEADD()Parametre olarak geçeceğimiz tarih’e gün, ay, yıl eklemek için kullanırız.
4DATEPART()Parametre olarak geçtiğimiz tarihin sadece gün, ay, yıl şeklinde parçalayıp alabiliriz.
5CONVERT()Tarih ve saat veri türlerini farklı formatlarda göstermek için kullanabiliriz.
6DAY()Parametre olarak geçtiğimiz tarihin gün kısmını verir.
7MONTH()Parametre olarak geçtiğimiz tarihin ay kısmını verir.
8YEAR()Parametre olarak geçtiğimiz tarihin yıl kısmını verir.

Makale Öncesi Bilgilendirmeler

Örneklerden hemen önce bazı bilgileri paylaşmak istiyorum haftanın ilk günü değerini sql’de global bir değişken olan DATEFIRST değişkeninden alabilirsiniz bu değişkendeki değer yine global bir değişken olan LANGUAGE değişkenindeki dil tanımına göre değişebilmektedir varsayılan olarak sql server dili us_english ‘dir ve us_english diline göre haftanın ilk günü değeri 7’dir 7 değeride haftanın pazar gününe denk gelmektedir(Pazartesi -> 1, …… Pazar -> 7) sizde kendi sql server’ınızdaki dil ve haftanın ilk günü bilgisini belirttiğimiz iki global değişken üzerinden alttaki kodlar ile öğrenebilirsiniz.

Sonuç

DilHaftanın İlk Günü
us_english7

Daha önce belirttiğim gibi buradaki değerler sizin kurulum sırasında seçtiğiniz dile veya sonrada SET LANGUAGE <diladi> veya SET DATEFIRST <haftaninilkgunu> kodlarına bağlı olarak farklı çıkabilir.

Şimdi ise Örneklere Geçelim

1- Getdate Fonksiyonu ile bugünün tarihini alalım

Bu fonksiyonda ise GETDATE() fonksiyonu ile bugünün tarihini alıyoruz.


2- Datediff Fonksiyonu ile belirlediğimiz bir tarih ile bugünkü tarih arasındaki gün sayısını alalım

Bu fonksiyonda ise ilk parametrede hesaplanacak iki tarih arasındaki sonucun size ne olarak geri dönmesini istersiniz ben DAY yazarak sonucun bana gün olarak geri dönmesini sağlıyorum 2.parametreye başlagıç tarihi belirtilmelidir siz buraya tablonuzda bulunan bir alanı kullanabilirsiniz ama ben manuel olarak girilmiş bir tarih yazıyorum 3.parametreye ise bitiş tarihi belirtilmektedir

3- DateAdd Fonksiyonu ile bugünkü tarihe gün,ay, yıl ekleme

Bu örneğimizde DATEADD fonksiyonun ilk parametresine ekleme yapacağımız tarih formatını belirtiyoruz DAY(GÜN), MONTH(AY), YEAR(YIL) olarak ve ikinci parametrede ise ekleme yapılacak değeri belirtiyoruz 3.parametrede ise siz tablonuzdan bir alanı belirtebilirsiniz ama ben örnek olarak bugünün tarihini GETDATE() fonksiyonuyla alıyorum.


4- DatePart Fonksiyonu ile belirli tarih içerisinden Gün, Ay, Yıl olarak parça halinde alabiliriz.

Bu sorguda DATEPART fonksiyonunun birinci parametresinde kullanılan DAY(GÜN) değeri ile 2.parametrede kullanmış olduğumuz GETDATE fonksiyonuyla bugünün tarihinden sadece günü alıyoruz.

DatePart fonksiyonuna kullanabileceğimiz diğer değerler şu şekildedir.

datepartKısaltmasıAçıklama
yearyy, yyyyYıl bilgisini verir.
quarterqq, qYıl içindeki çeyrek bilgisini verir. { [1,2,3] -> 1, [4,5,6] -> 2, [7,8,9] -> 3, [10,11,12] > 4 }
monthmm, mAy bilgisini verir.
dayofyeardy, ySayısal olarak yılın kaçıncı günü olduğunu verir.
daydd, dGün bilgisini verir.
weekwk, wwYıl içerisinde kaçıncı haftada olunduğu bilgisini verir.
weekdaydw1-7 arasında haftanın günü bilgisini verir.
hourhhSaat bilgisini verir
secondss, sSaniye bilgisini verir.
millisecondmsMilisaniye bilgisi verir.
microsecondmcsMikrosaniye bilgisi verir.
nanosecondnsNanosaniye bilgisi verir.
TZoffsettz
ISO_WEEKisowk, isoww

Kısaltma kısmında kullanılan “,” karakteri ile ayrılan değerlerin ikiside aynı sonucu vermektedir kısalatmanında kısaltması oluyor açıkçası 🙂


6,7,8 – DAY, MONTH, YEAR fonksiyonları ile GÜN, AY, YILI alma

Bu fonksiyonlar ile tablonuzda bir tarih alanını belirtebilir isterseniz aşağıdaki örnekte olduğunu GETDATE fonksiyonunu kullanarak parça halinde Gün, Ay, Yılı alabilirsiniz


Sql Server Tarih Veri Türleri

Şimdide Sql Server tarih veya tarih/saat veri tiplerinin veritabanında hangi formatta saklandığı ile ilgili bilgilere gözatalım

Veri TürüSaklanma FormatıAralıkHassasiyetAlan Boyutu(byte)Kullanıcı-Tanımlı kesirli ikinci hassasiyetSaat Dilimi Uzaklığı
timehh:mm:ss[.nnnnnnn]00:00:00.0000000 ile 23:59:59.9999999100 nanosaniye3 – 5EvetYok
dateYYYY:MM:DD0001-01-01 ile 9999-12-311 gün3HayırYok
datetimeYYYY-MM-DD hh:mm:ss[.nnn]1753-01-01 ile 9999-12-310.00333 saniye4HayırYok
smalldatetimeYYYY-MM-DD hh:mm:ss1900-01-01 ile 2079-06-061 dakika8HayırYok
datetime2YYYY-MM-DD hh:mm:ss[.nnnnnnn]0001-01-01 00:00:00.0000000 ile 9999-12-31 23:59:59.9999999100 nanosaniye6 – 8EvetYok
datetimeoffsetYYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm0001-01-01 00:00:00.0000000 ile 9999-12-31 23:59:59.9999999 (UTC’de)100 nanosaniye8 – 10EvetVar
timestampBenzersiz bir sayı

Timestamp bir tarih yada zaman türü değildir. timestamp rowversion için eşanlamlı bir göreve sahip ve kullanımdan kaldırılmıştır.

Kaynak

SQL DateTime Fonksiyonlarının Kullanımı
4.6 (92.5%) 16 oy

Bunlar da hoşunuza gidebilir...

10 Cevaplar

  1. abdullah dedi ki:

    select *from zamanlar tablomdaki saat 10:00 aolarak girilen veriyi datepart kullanarak sistem saati 10 olduğu zaman nasıl çekebilirim ?

    • Murat ÖNER dedi ki:

      Veriyi belirlenmiş bir tarih veya saatte çekmek için programlama tarafında(C#, PHP, Delphi v.b) task scheduler kütüphanesi kullanarak yapabilirsiniz. Sizin belirtmiş olduğunuz tablodaki saat alanı sistem saati ile eşleştiğinde task scheduler devreye girecek ve istediğiniz sorguyu bu şekilde çalıştırabileceksiniz tabi task scheduler’e zamanlar tablonuzdaki tüm zamanlanacak görevleri eklemelisiniz.

      • abdullah dedi ki:

        peki hocam asp.net’te dediğinizi kullanarak yaptım başarı ile çektim web sayfasını saat 10:00 da açtım saat on oldu adlı görev ekranda yazılı , saat 11:00’a geldiğinde dinamik olarak saat on bir oldu bilgisi gelirmi ?

        • Murat ÖNER dedi ki:

          Gelir bunu iki farklı yöntem ile yapabilirsin her dakikada bir javascript settimeout ile kontrol edebilirsin yada eğer trafik yüksek olan bir site olacak ise her dakikada bir sunucuya gidip gelmesi sorun olabilir bu durumda socket programlama ile yapabilirsiniz.

  2. ali tuner dedi ki:

    Aklım iyice karıştı… Alışveriş sitesi tasarlarken kullanabileceğimiz ve kafa karışıklığına mahal vermeyecek doğru format nedir ? Datetime değil çünkü yerel saati getiriyor meret. Zaman kaşesi mi kullanacağız ? Stamp denen zımbırtı…

    Birisi ürün aldı iade etmek istedi. Yaz saatinde aldı kış saatinde verdi. 1 saatlik değişim bile sistemi dengesizleştiriyor ona bakarsak.

    Bir kişi ayakkabı aldı saat 4 gibi ondan sonraki sipariş saat 3 de. Oldu mu şimdi ?!?

    Ne önerirsiniz Murat Bey ? Zaman kaşesi kullanıp yerel saate c# ile convert mü elelim her vakit ?!?

    • Murat ÖNER dedi ki:

      Merhaba Ali Bey,

      Alışveriş sitesi gibi çok fazla kişiye hitap eden projelerde tarih v.b. işlemlerin server side yapılması taraftarıyım local tarihler sıkıntı oluşturabilmektedir ve oynanabilmektedir maalesef. Bunun için sipariş tarihi yada iade tarihi gibi işlemlerin server side yapılır ise bir sıkıntı oluşturacağını düşünmüyorum.

  3. mahmut dedi ki:

    merhaba murat bey, sql tablomuzda date formatı tanımladım fakat şöyle bir problem ortaya çıktı; 2017-02-01 olan tablo ikinci kayıt yapıldığında 2017-01-02 olarak işleniyor. yani gün- ay / ay-gün yer değiştiriyor ve bunu bir türlü çözemedim. sizin bir öneriniz var mıdır?

    • Murat ÖNER dedi ki:

      Normalde tarih işlemleri için seçtiğiniz sql server veritabanı YYYY-MM-DD formatında saklamaktadır. Ki zaten sizde ilk formatın o şekilde olduğunu belirttiniz eğer alan tipiniz gerçekten date ise böyle bir durumun yaşanmaması gerekiyor bu durum için veritabanı Collation’unu kontrol edin isterseniz yada çözüm için insert yada update aşamasında CONVERT(date, ’23-12-2017′, 103) şöyle bir yöntemlede belki ilerleyebilirsiniz.

Bir Cevap Yazın