Bu yazımızda mysql tarih fonksiyonlarını tanıyacağız.
ADDDATE(
, date
,INTERVAL expr
unit
)ADDDATE(
expr
,days
)
DATE_ADD fonksiyonu ile eştir.
SELECT DATE_ADD('2008-01-02', INTERVAL 31 DAY) #
'2008-02-02'
SELECTADDDATE
('2008-01-02', INTERVAL 31 DAY)#
'2008-02-02'
DATE_ADD(
, date
,INTERVAL expr
unit
)DATE_SUB(
date
,INTERVAL expr
unit
)
Bu fonksiyonlar bir tarihten verilen zaman aralığını eklemek veya çıkarmak için kullanılır.
SELECT DATE_ADD('2011-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND) # '2012-01-01 00:01:00'
SELECT DATE_SUB('2011-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND) # '2010-12-30 22:58:59'
SELECT DATE_ADD('2011-01-01 00:00:00', INTERVAL '-1 10' DAY_HOUR) # '2010-12-30 14:00:00'
SELECT DATE_SUB('2011-01-02', INTERVAL 31 DAY) # '2010-12-02'
Ayrıca aşağıdaki gibi de bir tarihe ekleme çıkarma yapabiliriz.
SELECT '2011-12-31 23:59:59' + INTERVAL 1 SECOND # '2012-01-01 00:00:00'
SELECT INTERVAL 1 DAY + '2008-12-31' # '2009-01-01'
SELECT '2011-01-01' - INTERVAL 1 SECOND # '2010-12-31 23:59:59'
SELECT ADDTIME('2007-12-20 23:59:59.999999', '1 1:1:1.000002') # '2007-12-22 01:01:01.000001'
SELECT ADDTIME('01:00:00.999999', '02:00:00.999998') # '03:00:01.999997'
Şuanki tarihi 'YYYY-MM-DD' formatında döndürür. CURRENT_DATE()
ve CURRENT_DATE
fonksiyonları bu fonksiyon ile eştir.
SELECT CURDATE() # '2011-07-23'
SELECT CURDATE() + 1 # '20110724'
O anki saati döndürür.
SELECT CURTIME() # '18:41:06'
SELECT CURTIME() + 0 # '184106.000000'
CURRENT_TIME
ve CURRENT_TIME()
, CURTIME()
ile eştir.
Bir tarihi verilen format dizgesine göre formatlar.
SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y') # 'Sunday October 2009'
SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s') # '22:23:00'
SELECT DATE_FORMAT('1997-10-04 22:23:00','%H %k %I %r %T %S %w') # '22 22 10 10:23:00 PM 22:23:00 00 6'
Örneğin saat bilgisininde olduğu bir tarihten sadece tarih bilgisini almak istediğimizde bu fonksiyonu kullanıyoruz
SELECT DATE('2003-12-31 01:02:03') # '2003-12-31'
İki tarih arasındaki gün farkını verir.
SELECT DATEDIFF('2011-07-24 12:00','2011-05-16') # '69'
Tarihin gün ismini döndürür.
SLECT DAYNAME('2011-07-24') # 'Saturday'
Eğer gün isminin türkçe görünmesini istiyorsanız sorguyu aşağıdaki gibi yapmalısınız.
SET lc_time_names = 'tr_TR'; SELECT DAYNAME('2011-07-24'); # 'Pazar'
Bu tür işlemlerde dil kontrolü için buraya bakınız.
Tarihin haftanın kaçıncı günü olduğu değerini verir. Haftanın birinci günü pazar olacak şekildedir.
Aşağıdaki sorgumuzda tarih çarşamba günü olduğu için
bize 4 değerini verecektir.
SELECT DAYOFWEEK('2011-07-27') # '4'
Tarihin ayın kaçıncı günü olduğu değeri döndürür. DAY(
fonksiyonu bu fonksiyon ile eştir.date
)
SELECT DAYOFMONTH('2011-07-03') # '3'
Tarihin yılın kaçıncı günü olduğu değerini döndürür.
SELECT DAYOFYEAR('2011-07-24') # '205'
Bu fonksiyon ile bir tarihin herhangi bir parçasını alabiliriz.
SELECT EXTRACT(YEAR FROM '2009-07-02') # 2009
SELECT EXTRACT(YEAR_MONTH FROM '2009-07-02 01:02:03') # 200907
SELECT EXTRACT(DAY_MINUTE FROM '2009-07-02 01:02:03') # 20102
SELECT EXTRACT(MICROSECOND FROM '2003-01-02 10:30:00.000123') # 123
Gün sayısına ait tarihi verir.
SELECT FROM_DAYS(730669) # '2000-07-03'
FROM_UNIXTIME(
, unix_timestamp
)FROM_UNIXTIME(
unix_timestamp
,format
)
Bir unix_timestamp değerinden tarih değerini 'YYYY-MM-DD HH:MM:SS' veya YYYYMMDDHHMMSS.uuuuuu formatında verir.
SELECT FROM_UNIXTIME(1196440219) # '2007-11-30 18:30:19'
Ayrıca dönen tarihi formatlamak istersek ikinci argüman olarak format gönderilir.
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x') # '2011 25th Temmuz 06:53:15 2011'
GET_FORMAT({DATE|TIME|DATETIME}, {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})
Bu fonksiyon DATE_FORMAT()
ve STR_TO_DATE()
fonksiyonları ile beraber kullanılabilir.
SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR')) # '03.10.2003'
SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA')) # '2003-10-31'
Bir zamanın saat bilgisini döndürür.
SELECT OUR('10:05:03') # '10'
Bir tarihin gün değerini o ayın son gününün değeri ile değiştirip döndürür. Şöyleki tarihimiz '2011-08-04' olsun. Bu tarihin son günü 31'dir ve fonksiyon bize '2011-08-31' değerini verecektir.
SELECT LAST_DAY('2011-08-04') # '2011-08-31'
Argüman olarak gönderilen yıl ve gün bilgisine göre yılın o gününe denk gelen tarihi döndürür.
SELECT MAKEDATE(2014,365) # '2014-12-31'
SELECT MAKEDATE(2011,188) # '2011-07-07'
Argüman olarak gönderilen
saat, dakika, saniye değerlerinden hesaplanan zamanı döndürür.
SELECT MAKETIME(12,15,30) # '12:15:30'
Bir zamana ait mikrosaniye bilgisini döndürür.
SELECT MICROSECOND('12:00:00.123456') # '123456'
Bir zamana ait dakika bilgisini döndürür.
SELECT MINUTE('2008-02-03 10:05:03') # '5'
Bir tarihe ait ay bilgisini döndürür.
SELECT MONTH('2011-02-03') # '2'
Bir tarihe ait ayın ismini döndürür.
SELECT MONTHNAME('2008-02-03') # 'Şubat'
Şuanki tarihi 'YYYY-MM-DD HH:MM:SS' formatında verir.
SELECT NOW() # '2011-08-04 09:46:13'
LOCALTIME
, LOCALTIME()
, LOCALTIMESTAMP
, LOCALTIMESTAMP()
NOW()
fonksiyonu ile eşlerdir.
P periyoduna N kadar ay ekler. P periyodu YYMM veya YYYYMM formatında olmalıdır. Ay eklenmiş tarihi YYYYMM formatında döndürür.
SELECT PERIOD_ADD(200801,2) # '200803'
İki periyod arasındaki ay farkını verir
SELECT PERIOD_DIFF(200802,200703) # '11'
Bir zamana ait saniye bilgisini döndürür.
SELECT SECOND('10:05:03') # '3'
Argüman olarak verilen saniyeyi time olarak döndürür.
SELECT SEC_TO_TIME(2378) # '00:39:38'
DATE_FORMAT()
fonksiyonun tersidir. Argüman tarihe dönüştürülecek olan string ve bu stringin formatını alır ve bu stringi tarih olarak döndürür. Verilen format string ile uyuşmazsa geriye NULL döndürür.
SELECT STR_TO_DATE('May 1, 2013','%M %d,%Y') # '2013-05-01'
DATE_SUB()
fonksiyonu
İki zaman arasındaki farkı zaman türünden döndürür.
SELECT SUBTIME('01:00:00.999999', '02:00:00.999998') # '-00:59:59.999999'
Şuanki zamanı YYYY-MM-DD HH:MM:SS formatında verir. NOW()
fonksiyonu ile benzerdir. Arasındaki farkı açıklamaya çalışalım. SYSDATE()
fonksiyonu sorgunun çalıştırıldığı zamanı döndürürken, NOW()
fonksiyonu sorgunun başladığı ana ait zamanı verir. Örneğin sorgumuzda SLEEP()
fonkisyonu ile 2 saniye sorguyu bekletelim. Sorgu sonucunda bu iki fonksiyonun döndürdüğü zamanlara bakalım.
# Bu sorguda NOW() bize '2011-08-05 22:36:07' değerini döndürürken # SYSDATE() ise '2011-08-05 22:36:09' değerini döndürür. SELECT SLEEP(2), NOW(), SYSDATE()
Bir datetime tipindeki değerin time kısmını döndürür.
SELECT TIME('2003-12-31 01:02:03') # '01:02:03'
İki zaman arasındaki farkı saat olarak verir.
SELECT TIMEDIFF('2008-12-31 23:59:59.000001','2008-12-30 01:01:01.000002') # '46:58:57.999999'
TIMESTAMP(
, expr
)TIMESTAMP(
expr1
,expr2
)
Date veya datetime tipindeki veriyi datetime tipinde döndürür.
SELECT TIMESTAMP('2003-12-31') # '2003-12-31 00:00:00'
İkinci argüman olarak bir time tipinde değer gönderilirse bunu ilk argümana ekler ve geri döndürür.
SELECT TIMESTAMP('2003-12-10 14:00:00','13:00:00') # '2003-12-11 03:00:00'
TIMESTAMPADD(
unit
,interval
,datetime_expr
)
Bir date veya datetime tipindeki değere bir zaman dilimi ekler. İlk argüman saniye mi, dakika mı gibi eklenecek değerin türü, ikinci argüman ise eklenecek değer, üçüncü argüman ise eklenecek date veya datetime tipinde değerdir.
İlk argümanın alabileceği değerler :
MICROSECOND (microseconds), SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, veya YEAR
SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02') # '2003-01-02 00:01:00'
SELECT TIMESTAMPADD(WEEK,1,'2003-01-02') # '2003-01-09'
TIMESTAMPDIFF(
unit
,datetime_expr1
,datetime_expr2
)
İki zaman arasındaki farkı verir.
# iki zaman arasındaki yıl farkını alıyoruz. Sonuç = '-1' SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01')
# İki zaman arasındaki dakika farkını alalım. Sonuç = '128885' SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55')
Kullanımı DATE_FORMAT()
fonksiyonu ile benzerdir. Fakat sadece saat ile ile ilgili formatı kabul eder.
SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l') # '100 100 04 04 4'
time tipindeki değeri saniye cinsinden karşılığını döndürür.
SELECT TIME_TO_SEC('22:23:00') # '80580'
Sıfırıncı yıldan (milattan) verilen zamana kadar geçen gün sayısını döndürür.
SELECT TO_DAYS('2007-10-07') # '733321'
Sıfırıncı yıldan (milattan) verilen zamana kadarki geçen saniyeyi döndürür.
SELECT TO_SECONDS('2009-11-29') # '63426672000'
UNIX_TIMESTAMP()
, UNIX_TIMESTAMP(
date
)
'1970-01-01 00:00:00' tarihinden argüman olarak gönderilen tarihe kadar geçen saniyeyi döndürür. Eğer argüman gönderilmeden çağırılırsa '1970-01-01 00:00:00' tarihinden şuana kadar geçen saniyeyi döndürür.
SELECT UNIX_TIMESTAMP('2007-11-30 10:30:19') # '1196411419'
Şuanki UTC zamanını 'YYYY-MM-DD' formatında döndürür.
SELECT UTC_DATE() # '2011-08-05'
Şuanki UTC zamanını 'HH:MM:SS' formatında döndürür.
SELECT UTC_TIME() # '20:26:41'
UTC_TIMESTAMP
, UTC_TIMESTAMP()
Şuanki UTC zamanını 'YYYY-MM-DD HH:MM:SS' formatında döndürür.
SELECT UTC_TIMESTAMP() # '2011-08-05 20:27:41'
Bir tarihe ait hafta sayısını döndürür. İsterseniz ikinci argüman ile haftanın başlangıç gününü Pazar veya Pazartesi olarak değiştirebilirsiniz.
SELECT WEEK('2008-02-20') # '7'
SELECT WEEK('2008-02-20',1) # '8'
Bir tarihin haftanın kaçıncı günü olduğu bilgisini döndürür
SELECT WEEKDAY('2008-02-03 22:23:00') # '6'
Bir tarihin yılın kaçıncı haftası olduğu bilgisini döndürür. Bu fonksiyon yerine WEEK(
şeklinde kullandığımız zaman aynı sonucu alırız.date
,3)
SELECT WEEKOFYEAR('2008-02-20') # '8'
Bir tarihin yıl bilgisini döndürür.
SELECT YEAR('1987-01-01') # '1987'
Görüldüğü üzere işimizi oldukça kolaylaştıracak ve problemlerimize kolaylıkla çözüm bulmamızı sağlayacak bir çok mysql fonksiyonu mevcut.
Projelerimize başlamadan önce bu fonksiyonları incelemekte fayda görüyorum.
İyi çalışmalar.
Merhaba,
mysql “dergi_goster” tablosundaki “siparis_bitis_tarih_ay_yil” colonunda bir hafta öncesi kayıtların hepsini silmek istiyorum asıl yapabilirim yardımcı olurmusunuz ?
Merhaba,
colonun tipi nedir?
hepsi varchar
siparis_bitis_tarih_ay_yil = donen deger :01-31-2012
varchar tarih_saat_dakika = donene deger: 10:31:38
silmek istediğim olay bugunden 3 gün önceisne ait ve aynı dakikaya ait verileri silmek
örnek :
bugun = 02-12-2012
benim silmek istediğim tarhi öncesi
02-09-2012 10:31:38 öncesini silmek istiyorum
http://olcaybal.com/DOSYALAR/DB.png
http://olcaybal.com/DOSYALAR/kod.png
hocam yemedi problem nerdedir acaba ?
şimdi benim sana atttığım sorgu sipariş bitiş tarihi 3 gün geçenleri siler. yani şuan sana verdiğim sorguyu çalıştırdığında veritabanında sipariş bitiş tarihi 9.02.2012 ve saati 13:26:30 olan kayıt varsa onu siler dikkat edersen sorgunun sonuda =‘3’ koşulu var. sorgunun sonunda eğer sen onu >3 yaparsan sipariş bitiş tarihi 9.02.2012 ve saati 13:26:30 ve daha eski tarihte olanları silecektir.
Sana attığım sorgudan veya bu sayfadaki fonksiyonları inceleyerek çok rahat çözüm bulabileceğini düşünüyorum.
NOT : Daha önce de rica etmiştim yorum yapan değerli arkadaşlarımdan. Burayı forum havasına çevirmeyelim lütfen.
Merhaba,
Saniye cinsinden verilen bir değerin kaç ay,kaçgün, kaç saat, kaç dk ve kaç sn olduğunu bir hücrede hesaplayıp, “mm.dd.hh:minmin:ss” şeklinde formatlayabileceğim bir komut var mı?
http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_from-unixtime">FROM_UNIXTIME bu fonksiyon işinizi görecektir.
Merhaba,
bir ayda kaç Pazartesi veya bir ayda kaç çarşamba olduğunu nasıl hesaplayabilirim?
Bu şekilde bir hesaplama yapan mysql fonksiyonu göremedim. Bunu kullandığınız programlama dili ile döngülerle yapabilirsiniz.
Merhaba,
Bir tabloda tarih ve saat kolonu var. Saat kolonu ss:dd:ss şeklinde veri tutuyor.
Benim istediğim 2012-12-01 tarihine ait kayıtları dakika bazında gruplamak. Örneğin;
2012-12-01 00:00:00&00:01:00 arası 35 kayıt
2012-12-01 00:01:00&00:02:00 arası 58 kayıt
Bunu nasıl yapabilirim?
Merhaba , bitis tarihi bugünden öncekileri nasıl çağırabilirim .
Örneğin ,
bugünün tarihi 10.11.2012
bitistarih 25.03.2011 veya bitistarih 22.07.2012
MySQL tarih fonksiyonları hakkında geniş kapsamlı bir anlatım olmuş. Örnekler ile çok güzel ifade edilmiş yazılarınız için teşekkür ederim. Herkesin elinin altında olması gereken işlemler. Buna benzer mysql işlemleri ile daha detaylı bilgilere’de yer verirseniz memnun oluruz. İyi çalışmalar.
Teşekkür ederim. İyi çalışmalar.
Merhaba
bir sipariş formu hazırladım.
siparişleri sipariş, kayıttarihi, (tabloda VARCHAR ve date=(dmy)gibi giriyorum)değerlendirildi, değerlendirilmedi, tamamlandı, tamamlanmadı, olarak db de tek tabloda işliyorum.
bir durum sayfam var.
bu sayfada toplam başarılı siparişler, başarısız siparişler vs dökümler var.
beceremediğim şey, iki gün içinde değerlendirmemiş olduğum siparişlerin sayısını görmek istiyorum. nasıl çekebilirim?
Bir talep formu hazırladım.
Bitti sayılır fakat belkide benim için en zor iki iş duruyor.
istediğim şey, talepler tablosundan talep kayıt tarihinin üzerinden iki gün geçmiş olmasına rağmen hala sonuc = Onay Bekliyor olan talepleri listelemek.
mysql kayittarihi sütunum Timestamp Current_timestamp,
mysql sonuc sütunumda veriler Onay Bekliyor, Talep Değerlendirildi vs. şeklinde
yardım edermisiniz.
ayrıca bir ayda sıfırdan çok şey öğrendim. onun için şundaki hata nedir yada düşüncemmi yanlıştır anlatabilirmisiniz?
Çok faydalı kodlar. Teşekkürler.
Merhaba,
Öncelikle anlatımız çok faydalı olmuş teşekkürler. Benim şöyle bir sorunum yardımıcı olabilirsiniz sevinirim mysql de girilmiş olan tarihe göre sitede verileri gösteriyorum fakat güncelleme saatinin 00:00 da değil sabah 09:00 olmasını istiyorum bu mümkünmüdür ? Şimdiden teşekkürler.