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/Tarih Saat Formatları Nedir, Nasıl Kullanılır?
Sql Server DateTime(Tarih Saat) Fonksiyonları
Fonksiyon | Açıklama | |
---|---|---|
1 | GETDATE() | 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. |
2 | DATEDIFF() | İki tarih arasındaki farkı gösterir |
3 | DATEADD() | Parametre olarak geçeceğimiz tarih’e gün, ay, yıl eklemek için kullanırız. |
4 | DATEPART() | Parametre olarak geçtiğimiz tarihin sadece gün, ay, yıl şeklinde parçalayıp alabiliriz. |
5 | CONVERT() | Tarih ve saat veri türlerini farklı formatlarda göstermek için kullanabiliriz. |
6 | DAY() | Parametre olarak geçtiğimiz tarihin gün kısmını verir. |
7 | MONTH() | Parametre olarak geçtiğimiz tarihin ay kısmını verir. |
8 | YEAR() | 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.
1 | SELECT @@LANGUAGE Dil, @@DATEFIRST 'Haftanın İlk Günü' |
Sonuç
Dil | Haftanın İlk Günü |
---|---|
us_english | 7 |
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.
1 | SELECT GETDATE() |
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
1 | SELECT DATEDIFF(DAY,'2012-08-06',GETDATE()) |
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.
1 | SELECT DATEADD(DAY,10,GETDATE()) |
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.
1 | SELECT DATEPART(DAY,GETDATE()) |
DatePart fonksiyonuna kullanabileceğimiz diğer değerler şu şekildedir.
datepart | Kısaltması | Açıklama |
---|---|---|
year | yy, yyyy | Yıl bilgisini verir. |
quarter | qq, q | Yıl içindeki çeyrek bilgisini verir. { [1,2,3] -> 1, [4,5,6] -> 2, [7,8,9] -> 3, [10,11,12] > 4 } |
month | mm, m | Ay bilgisini verir. |
dayofyear | dy, y | Sayısal olarak yılın kaçıncı günü olduğunu verir. |
day | dd, d | Gün bilgisini verir. |
week | wk, ww | Yıl içerisinde kaçıncı haftada olunduğu bilgisini verir. |
weekday | dw | 1-7 arasında haftanın günü bilgisini verir. |
hour | hh | Saat bilgisini verir |
second | ss, s | Saniye bilgisini verir. |
millisecond | ms | Milisaniye bilgisi verir. |
microsecond | mcs | Mikrosaniye bilgisi verir. |
nanosecond | ns | Nanosaniye bilgisi verir. |
TZoffset | tz | |
ISO_WEEK | isowk, 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
1 2 3 4 5 6 | --Günü Alma SELECT DAY(GETDATE()) --Ayı Alma SELECT MONTH(GETDATE()) --Yılı Alma SELECT YEAR(GETDATE()) |
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ık | Hassasiyet | Alan Boyutu(byte) | Kullanıcı-Tanımlı kesirli ikinci hassasiyet | Saat Dilimi Uzaklığı |
---|---|---|---|---|---|---|
time | hh:mm:ss[.nnnnnnn] | 00:00:00.0000000 ile 23:59:59.9999999 | 100 nanosaniye | 3 – 5 | Evet | Yok |
date | YYYY:MM:DD | 0001-01-01 ile 9999-12-31 | 1 gün | 3 | Hayır | Yok |
datetime | YYYY-MM-DD hh:mm:ss[.nnn] | 1753-01-01 ile 9999-12-31 | 0.00333 saniye | 4 | Hayır | Yok |
smalldatetime | YYYY-MM-DD hh:mm:ss | 1900-01-01 ile 2079-06-06 | 1 dakika | 8 | Hayır | Yok |
datetime2 | YYYY-MM-DD hh:mm:ss[.nnnnnnn] | 0001-01-01 00:00:00.0000000 ile 9999-12-31 23:59:59.9999999 | 100 nanosaniye | 6 – 8 | Evet | Yok |
datetimeoffset | YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm | 0001-01-01 00:00:00.0000000 ile 9999-12-31 23:59:59.9999999 (UTC’de) | 100 nanosaniye | 8 – 10 | Evet | Var |
timestamp | Benzersiz 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
- http://www.w3schools.com/sql/sql_dates.asp
- http://blogs.msdn.com/b/cdnsoldevs/archive/2011/06/22/why-you-should-never-use-datetime-again.aspx
- https://docs.microsoft.com/en-us/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql?view=sql-server-2017
📚 Benzer Makaleler
- Sql de Tüm Ayların Son Günlerini Alma
- Sql Server da Unutulan “sa” Şifresini 3 Farklı Yöntem ile Değiştirme
✍ Lütfen olumlu-olumsuz tüm görüşlerinizi bana yorum yada mail yolu ile iletmeyi ihmal etmeyin.
🔗 Sosyal medya kanallarından makaleyi paylaşarak destek olursanız çok sevinirim.
👋 Bir sonraki makalede görüşmek dileğiyle.
Çok teşekkür ederim .
Merhaba Murat Bey Month callender dan seçilen iki tarih arasında sql sorgusu ile çözüm bulma arayışım var fakat tarihleri sql sorgusu içinde değerlendiremedim . C# Kullanıyorum ve iki tarih tanımladım
DateTime date = (DateTime)clnd_anasayfa.SelectionStart;
DateTime date1 = (DateTime)clnd_anasayfa.SelectionStart;
“SELECT * FROM PersonelTbl WHERE Personelid IN ( SELECT DISTINCT dbo.PersonelTbl.Personelid FROM dbo.PersonelTbl FULL Outer JOIN dbo.GorevTbl ON dbo.PersonelTbl.Personelid = dbo.GorevTbl.pilot1id OR dbo.PersonelTbl.Personelid = dbo.GorevTbl.pilot2id LEFT JOIN dbo.izinTbl ON dbo.PersonelTbl.Personelid = dbo.izinTbl.Personelid WHERE pilot1id IS NULL OR pilot2id IS NULL AND dbo.GorevTbl.GorevBasTarih ‘date1’ AND dbo.izinTbl.izinbaslangıcTarihi ‘date1’) AND Ab212< 4 ORDER BY Ab212 ASC "
Sorgum da bu şekilde tanımladığım Date leri nasıl sorgulayabilirim yardımcı olursanız çok sevinirim .
İyi çalışmalar
Doğrudan SqlCommand nesnesini üzerinden bir sorgu çalıştırdığınızı düşünerek one göre öneride bulunacağım. Alttaki kodda göreceğiniz gibi sql sorgunuz içerisinde ‘date1’ kısımlarını silerek @date1 adında parametre tanımı eklendi ve değeri sqlCommand.Parameters.AddWithValue() kullanılarak sorguya güvenli bir şekilde tarih değerinizin eklenilmesi sağlandı.
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?
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.
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 ?!?
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.
select *from zamanlar tablomdaki saat 10:00 aolarak girilen veriyi datepart kullanarak sistem saati 10 olduğu zaman nasıl çekebilirim ?
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.
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 ?
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.
teşekkür ederim hocam… basit bir örnek proje hazırlayıp mail adresimden benimle iletişime geçme ihtimaliniz var mı?
Zamanım olsa çok yardımcı olmak isterdim.