MySQL Gün, Ay ve Yıla Göre İşlemler Yapmak

Merhaba arkadaşlar,
Geçenlerde bir internet sitesinde şöyle bir sistem gördüm: Kullanıcı sitedeki verilerini yıllara göre listelemişti. İçerik olmayan yıllar hiç görünmüyordu. Örnek olarak 2014 yılında hiç içerik girilmemiş. Yılların listesi şöyleydi:

  • 2010
  • 2011
  • 2012
  • 2013
  • 2015
  • 2016

Bu yıllara tıkladığınızda da içerisinde aylar listeleniyordu ve yine aynı şekilde içerisinde veri olmayan aylar listelenmiyordu. Önce bunu nasıl yaptıklarını düşündüm ve aklıma ilk gelen şey veritabanında ay yıl ve günleri ayrı ayrı alanlarda tutup GROUP BY ile verileri gruplayıp yazdırdıkları oldu. Ben de sistemi bu şekilde yazmayı düşünüyordum ki daha sonra daha kolay bir yolu olabileceğini düşünüp Google Amca’ya sordum. Stackoverflow sayesinde de bu olayın aslında ne kadar kolay bir şekilde çözülebileceğini gördüm. Şimdi de bu yöntemi size anlatıyorum. Öncelikle veritabanımıza birkaç veri ekleyelim ki sonucu düzgün bir şekilde görelim.

Bu arada sanırım tarih formatının “Y-m-d H:i:s” yani “Yil-ay-gun saat:dakika:saniye” şeklinde olması gerekiyor. Farklı formatlarda denemedim henüz.

Ben örnek olması açısından veritabanıma 200 tane rastgele String ifade ve rastgele tarih ekledim. Şimdi bu verileri siz de alın ve veritabanınıza kopyalayın. Önce şu komutla veritabanımız içerisine dersler adında bir tablo oluşturalım.

CREATE TABLE `dersler` (
  `ders_id` int(11) NOT NULL AUTO_INCREMENT,
  `ders_baslik` varchar(110) NOT NULL,
  `ders_tarih` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ders_id`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8

Dersler adında 3 adet alana sahip bir tablo oluşturmuş olduk. Şimdi içerisine birkaç rastgele değer ekleyelim. Birkaç derken, yaklaşık 200 tane. 😀

INSERT INTO `dersler`
VALUES
(1,'zbPcFuJCNr','2013-12-29 23:35:07'),
(2,'VNOBK6MjAu','2014-04-10 15:32:06'),
(3,'8lUN9UaKnJ','2016-01-21 23:53:23'),
(4,'cWBHFeu7Kq','2016-05-24 05:41:14'),
(5,'z2FFOZfjRo','2016-04-02 09:49:31'),
(6,'McOHmy46vh','2015-01-01 00:18:44'),
(7,'7YJltQ5ULE','2011-12-13 01:52:03'),
(8,'qjLqz4hXK4','2016-05-13 03:12:46'),
(9,'yLw7PDC6HK','2012-06-24 12:31:35'),
(10,'q5zhat2Ppt','2012-02-13 15:02:12'),
(11,'aTIfbGZfQx','2012-05-31 17:38:08'),
(12,'nFQ1iWI228','2011-09-25 04:37:03'),
(13,'Bpi4s7uWhE','2012-04-19 05:38:19'),
(14,'ZU2GThwriT','2015-11-30 11:11:42'),
(15,'8Up5Cr7LzJ','2012-04-03 12:26:16'),
(16,'SOE0iAhXrg','2012-08-03 01:13:01'),
(17,'tWLLtd3mkc','2016-01-11 14:39:38'),
(18,'KhUcpFL8QD','2013-01-31 09:03:18'),
(19,'vDf5Ucxb40','2016-05-30 21:20:28'),
(20,'QLB4PYp1g9','2012-05-16 19:43:45'),
(21,'alHQ7QHKMc','2013-03-02 08:14:09'),
(22,'2hjfOvkPDa','2013-08-26 10:12:31'),
(23,'ffpeEquOJF','2014-08-24 09:43:44'),
(24,'rvhhc24oq6','2012-06-26 05:20:10'),
(25,'JlueFkSQV8','2015-01-27 02:39:21'),
(26,'kmLLRzvwJW','2012-03-06 13:30:32'),
(27,'0dd2hCtoid','2011-10-27 02:12:41'),
(28,'Nsp7kg2tmn','2015-05-11 16:35:40'),
(29,'79HGEeqBfq','2015-11-17 16:12:52'),
(30,'tt66Wuoaeb','2015-10-11 10:09:18'),
(31,'DjXTmqgKgn','2014-10-06 02:53:50'),
(32,'Y4ycv9sWYW','2016-03-03 20:04:24'),
(33,'52mzqwOC8r','2013-09-29 16:47:57'),
(34,'6liwC2N0WL','2016-05-20 04:05:34'),
(35,'vXAFpwEmVJ','2012-01-28 12:10:04'),
(36,'ijPO7sXzo4','2013-08-24 17:30:22'),
(37,'HAxKnxG9Cb','2016-04-09 22:53:01'),
(38,'cRxIvTEehW','2012-03-31 17:49:31'),
(39,'6LFzJeXN9E','2014-06-01 00:51:29'),
(40,'GoLe5VQh22','2013-08-12 18:51:17'),
(41,'zLDspSKlqR','2012-05-18 04:46:57'),
(42,'5qQknDu21b','2012-04-04 05:50:16'),
(43,'NpwJfOLiXl','2013-11-21 18:44:08'),
(44,'BNttyPUpW0','2011-12-27 05:44:47'),
(45,'MldqPgs0Hg','2015-11-03 16:44:34'),
(46,'eZF3LY061B','2013-09-28 19:22:37'),
(47,'v5skZRg0G3','2016-03-10 12:56:46'),
(48,'UtaaWaScA6','2013-05-15 21:21:22'),
(49,'f9Xda3fLXK','2012-09-04 21:45:29'),
(50,'p4QhlQYobS','2015-12-03 18:28:11'),
(51,'l3OwV162dm','2016-01-13 04:15:16'),
(52,'bzmfP7dAYC','2012-08-27 13:41:08'),
(53,'OUZESoQKgb','2014-12-20 15:35:22'),
(54,'4HJ5OLjaYu','2015-09-22 21:44:15'),
(55,'kJzsW9qzOf','2015-05-28 02:58:18'),
(56,'OTmcK7tVVx','2014-01-29 21:09:48'),
(57,'EDsqWCprmJ','2014-11-19 07:55:08'),
(58,'Wb85BHURbI','2012-08-02 05:29:50'),
(59,'xVvEoqAW4f','2015-06-20 00:35:47'),
(60,'wGw95YwO9s','2014-07-24 03:01:04'),
(61,'hyCZstabeI','2011-09-07 23:01:50'),
(62,'JnwaXsfc2L','2012-04-12 16:18:22'),
(63,'yVXwrMGUMX','2016-01-22 13:01:09'),
(64,'oXVR875QeO','2013-12-23 19:40:06'),
(65,'LYbddnfZfO','2012-10-15 00:32:58'),
(66,'dlmZ1gLZJ9','2016-04-15 07:26:35'),
(67,'E04M6V1V9M','2016-06-05 18:03:28'),
(68,'kZ7Hf7X33a','2016-03-11 02:59:24'),
(69,'paqGVqp5n4','2013-09-07 22:58:05'),
(70,'sQcnR7xD1R','2012-03-01 18:41:17'),
(71,'9zShwWkHlK','2014-11-10 16:53:15'),
(72,'LqNcQSzUY2','2016-01-10 00:34:37'),
(73,'bpDiXhkOUt','2015-07-08 22:03:36'),
(74,'NKUJ5C4PuQ','2013-08-12 02:40:43'),
(75,'i25aC09EMk','2012-12-09 22:50:59'),
(76,'pD1HXQCqep','2012-01-18 05:03:43'),
(77,'99hMe6g4ly','2012-08-17 13:21:33'),
(78,'rJKsTofdtF','2012-04-19 13:48:58'),
(79,'vmNlYezoqJ','2015-12-05 11:39:24'),
(80,'HvMNMR9lZB','2014-06-15 03:36:05'),
(81,'J4Y8jbCY27','2012-01-31 02:13:31'),
(82,'Qsj52IwMgd','2013-05-09 12:08:17'),
(83,'314VbpUNuE','2013-02-07 20:00:59'),
(84,'sNaEp9Gwux','2015-12-27 16:14:13'),
(85,'NC2w8OMm6Q','2016-08-18 10:03:39'),
(86,'aMzzGm4ldw','2013-08-06 20:39:24'),
(87,'oayyR42o4P','2012-05-22 01:37:31'),
(88,'6l9U8v1ZTb','2011-10-10 00:51:24'),
(89,'sLsPPN3lWs','2015-06-27 21:38:06'),
(90,'u0oz2NDROK','2014-05-01 06:03:34'),
(91,'YFmtGlnR6Q','2012-10-09 05:59:42'),
(92,'yGsmJOjblO','2014-10-28 07:44:12'),
(93,'Jnex16lLjj','2012-08-20 19:03:47'),
(94,'FN71bY82BG','2013-10-30 14:41:03'),
(95,'43rSnDdbPX','2015-03-28 01:20:47'),
(96,'3uA9Qlt9M8','2014-06-27 09:10:31'),
(97,'Ta8SibuZTy','2016-06-26 00:39:44'),
(98,'krpYFBNC9Q','2011-11-26 22:27:21'),
(99,'K0X5t7SC5L','2012-04-06 05:51:39'),
(100,'eE4p83iH6D','2015-08-02 00:50:03'),
(101,'ntAt8XiVOU','2015-03-13 09:49:13'),
(102,'d2oH1hhMG4','2013-02-04 10:25:52'),
(103,'TbWGd53qNq','2016-02-28 16:20:54'),
(104,'nU3lcYa7gn','2016-04-03 14:25:18'),
(105,'E4cWmZDrTx','2012-07-22 05:40:07'),
(106,'PeQVhhIIc5','2014-10-31 11:46:56'),
(107,'frPeBXuY89','2014-10-19 10:00:33'),
(108,'l6qkKRdhu3','2011-12-19 18:24:38'),
(109,'lYMCGvOM73','2014-03-18 06:55:14'),
(110,'XiPVMO3WRo','2012-10-14 20:48:05'),
(111,'iJN9X4E0zZ','2011-11-27 13:19:34'),
(112,'mCFRqrZuFW','2016-08-06 00:12:02'),
(113,'vRzjVwbkyt','2015-08-14 07:58:26'),
(114,'lD0qh10h0m','2011-12-22 15:07:48'),
(115,'Gek8dPNaBj','2016-02-27 07:07:52'),
(116,'bCYHOighmC','2011-11-26 09:03:04'),
(117,'n2co3upqn5','2016-04-10 23:43:35'),
(118,'IdSx139k6k','2014-12-10 08:48:12'),
(119,'42Lnj2JVX6','2016-06-11 16:58:23'),
(120,'av2FUs306L','2016-08-02 16:24:14'),
(121,'Zif2rz8Mwc','2012-10-15 00:44:04'),
(122,'iz8lj4ip3t','2015-11-02 06:34:59'),
(123,'58QxbQEX4D','2016-04-24 06:00:41'),
(124,'jFHTOuq0kI','2012-12-12 23:47:01'),
(125,'t3TxmjBQfH','2014-08-19 00:51:47'),
(126,'5faWT80xnk','2016-08-04 16:04:48'),
(127,'5d1AD2UmCn','2012-09-30 03:56:29'),
(128,'wVMQxC6eBb','2013-10-04 15:28:38'),
(129,'M8oU8Vis8n','2014-02-10 02:27:17'),
(130,'aXkcSGPf6m','2015-02-01 13:08:40'),
(131,'ScIuiX6urS','2012-07-31 05:12:48'),
(132,'PMLL4eUsU4','2014-10-18 15:02:41'),
(133,'ehiV6x1sJT','2013-10-11 21:23:22'),
(134,'roYovsQn5F','2015-01-03 15:05:23'),
(135,'Qqf4kHZp7d','2012-07-04 04:09:30'),
(136,'p8MXafG4U8','2015-02-06 06:49:30'),
(137,'SxYlnlr2wi','2014-01-09 21:44:17'),
(138,'LnOsmezAUZ','2014-01-25 23:35:29'),
(139,'HXTWEXRMqK','2015-04-20 14:40:46'),
(140,'o6GKxJhPd2','2013-04-04 23:07:39'),
(141,'2uyg48a4RS','2012-09-05 15:36:05'),
(142,'LOFIGs8qLx','2011-10-21 15:10:50'),
(143,'si3czTpB5r','2014-04-18 20:23:47'),
(144,'EIbNSfFKhq','2012-03-20 14:03:20'),
(145,'X8fphGaPcD','2014-07-18 16:29:06'),
(146,'gPH9fjfHpT','2012-04-21 04:34:27'),
(147,'BHiRm38MC5','2013-09-30 16:22:00'),
(148,'SvcyF1Lj92','2016-04-01 14:37:52'),
(149,'Qbo9r6zkwb','2012-05-29 11:47:58'),
(150,'O2oRbauh5n','2011-11-03 00:08:26'),
(151,'hWsiHLrJUi','2015-07-27 22:50:16'),
(152,'jsmp1HVdJK','2016-04-29 22:18:30'),
(153,'8Bri6IntuE','2012-12-13 17:48:11'),
(154,'WX7IpRCHNW','2013-10-05 14:31:26'),
(155,'9lbRhoB1EJ','2012-06-16 19:38:41'),
(156,'52JOpdj4Dg','2014-11-06 09:39:04'),
(157,'LYqCB8pxiz','2011-10-26 22:13:36'),
(158,'traS3bxMOD','2016-02-07 03:24:36'),
(159,'yreMKjp1kb','2015-10-16 14:26:20'),
(160,'LNAUd7cM0G','2016-08-19 16:10:48'),
(161,'azhm64bJTK','2012-10-24 20:52:25'),
(162,'7wWqWXL7Xx','2012-08-14 13:07:16'),
(163,'xr8FEUGk8R','2016-04-10 18:27:52'),
(164,'qe0upKn9Vv','2016-02-27 23:26:03'),
(165,'SWCQHKNfFl','2015-02-05 14:50:33'),
(166,'N1lIHFRzzh','2015-02-22 18:13:50'),
(167,'zMdj9nfF37','2015-09-10 04:00:35'),
(168,'GXjrLy66fU','2014-09-15 01:26:32'),
(169,'BCPgupPLdp','2012-04-21 20:54:45'),
(170,'qIHNXmR5Yy','2014-06-03 12:10:12'),
(171,'iZOR5V602I','2011-12-11 10:04:15'),
(172,'SY7iOTvdrV','2014-11-01 16:38:05'),
(173,'9JUwAZu83M','2016-05-20 23:26:00'),
(174,'RDdMKePsRI','2012-04-27 17:30:59'),
(175,'Y0gSvtjrqt','2013-11-23 21:06:08'),
(176,'kZLkuUng2e','2012-07-09 04:58:00'),
(177,'f1FuR8lzzk','2016-03-30 18:16:25'),
(178,'Pc5jwwKZH4','2014-08-04 03:25:51'),
(179,'sosmMJo0EE','2016-08-04 10:44:11'),
(180,'j8Tsut2O3R','2011-11-16 06:26:15'),
(181,'9byGVxn0wP','2011-10-16 13:05:36'),
(182,'ZcbJAcnfeH','2013-09-24 01:52:24'),
(183,'8aSCcGF4IO','2013-08-10 23:16:49'),
(184,'gubNSckIBk','2012-12-16 12:25:20'),
(185,'N3vZrKe98n','2016-03-20 12:00:21'),
(186,'0ZwHFApuQF','2013-04-10 10:42:56'),
(187,'1tReOzQ8tD','2016-08-14 15:16:17'),
(188,'ZDEJSNRg7S','2012-09-05 14:55:30'),
(189,'DAVdZp3Fo5','2012-12-15 09:02:09'),
(190,'gjYQa6kNjj','2012-06-15 07:51:02'),
(191,'X2jLUASNPw','2013-11-19 13:39:39'),
(192,'LKmaO2zTcQ','2013-07-19 03:11:48'),
(193,'aGnh0bAjDy','2012-10-16 12:34:35'),
(194,'Xjgxc3nJr8','2013-06-21 16:09:07'),
(195,'OjhQTb3Jpd','2014-01-20 01:01:54'),
(196,'NvqZ5KCE6z','2013-10-08 02:39:13'),
(197,'n6artTSBnG','2016-07-02 12:15:42'),
(198,'ExOQAxfOX2','2016-04-12 06:05:52'),
(199,'o1p8E3ed1B','2013-04-03 15:57:53'),
(200,'c3N5VpsCk7','2013-04-19 09:51:03');

Bu verileri veritabanımıza eklediysek eğer şimdi asıl olayımıza bakabiliriz. Şimdi ilk örneğimizle başlayalım. Ben sadece içinde veri olan yılları öğrenmek istiyorum. Bunun için GROUP BY kullanabilirim. Hemen SQL komutu verebileceğim herhangi bir yer açıyorum ve şu SQL kodunu çalıştırıyorum.

SELECT * FROM dersler GROUP BY YEAR(ders_tarih)

Bu kodu çalıştırdığımızda bize şu çıktıyı verecektir.

+---------+-------------+---------------------+
| ders_id | ders_baslik | ders_tarih          |
+---------+-------------+---------------------+
|       7 | 7YJltQ5ULE  | 2011-12-13 03:52:03 |
|       9 | yLw7PDC6HK  | 2012-06-24 15:31:35 |
|       1 | zbPcFuJCNr  | 2013-12-30 01:35:07 |
|       2 | VNOBK6MjAu  | 2014-04-10 18:32:06 |
|       6 | McOHmy46vh  | 2015-01-01 02:18:44 |
|       3 | 8lUN9UaKnJ  | 2016-01-22 01:53:23 |
+---------+-------------+---------------------+

YEAR fonksiyonu ile TimeStamp formatındaki bir verinin sadece yılını alabiliyoruz. Gördüğünüz gibi her tarihten sadece bir ders aldı. Bu sayede 1 tane bile olsa o yıla ait içerik olduğunu öğrenmiş olduk. İçinde veri olan tüm yılları elde ettik.

Şimdi daha farklı bir örnek yapalım. Bir de bu yıllara ait kaçar veri olduğunu listeleyelim. Bunu yapmak için de COUNT fonksiyonunu kullanacağız. Kodumuz burada:

SELECT *, COUNT(*) AS toplam FROM dersler GROUP BY YEAR(ders_tarih)

Yazdığımız bu kod şu anlama geliyor. dersler tablosunda ders_tarih alanını yılına göre grupla ve bir de tablodaki tüm verilerin yanı sıra o an çektiğin verileri sayısını da bize döndür ama toplam isminde bir alan olarak döndür. Bu kodumuzun çıktısı da şu şekilde olacaktır.

+---------+-------------+---------------------+--------+
| ders_id | ders_baslik | ders_tarih          | toplam |
+---------+-------------+---------------------+--------+
|       7 | 7YJltQ5ULE  | 2011-12-13 03:52:03 |     17 |
|       9 | yLw7PDC6HK  | 2012-06-24 15:31:35 |     51 |
|       1 | zbPcFuJCNr  | 2013-12-30 01:35:07 |     33 |
|       2 | VNOBK6MjAu  | 2014-04-10 18:32:06 |     30 |
|       6 | McOHmy46vh  | 2015-01-01 02:18:44 |     29 |
|       3 | 8lUN9UaKnJ  | 2016-01-22 01:53:23 |     40 |
+---------+-------------+---------------------+--------+

Gördüğünüz gibi bize burada toplam sayılarımızı verdi. Ben verdiği değerlere inandım. Siz inanmazsanız sayabilirsiniz.

Şimdi birkaç tane daha böyle örnek yapalım. Bu örneğimizde de 2011’de hangi aylarda veri olduğunu listeletelim. Bunun için YEAR fonksiyonunu WHERE koşulumuzda kullanacağız ve GROUP BY içerisinde de MONTH fonksiyonunu kullanacağız. Evet tahmin edebileceğiniz üzere birkaç tane daha böyle fonksiyonumuz var. Bunu tablo halinde aşağıda veriyorum.

Fonksiyonun Adı Döndürdüğü Değer
YEAR() Tarih Verisindeki Yıl Değerini Döndürür.
Örnek Veri: 2016-09-05 17:18:36
Döndüreceği Değer: 2016
MONTH() Tarih Verisindeki Ay Değerini Döndürür.
Örnek Veri: 2016-09-05 17:18:36
Döndüreceği Değer: 9
DAY() Tarih Verisindeki Gün Değerini Döndürür.
Örnek Veri: 2016-09-05 17:18:36
Döndüreceği Değer: 5
HOUR() Tarih Verisindeki Saat Değerini Döndürür.
Örnek Veri: 2016-09-05 17:18:36
Döndüreceği Değer: 17
MINUTE() Tarih Verisindeki Dakika Değerini Döndürür.
Örnek Veri: 2016-09-05 17:18:36
Döndüreceği Değer: 18
SECOND() Tarih Verisindeki Saniye Değerini Döndürür.
Örnek Veri: 2016-09-05 17:18:36
Döndüreceği Değer: 36

İsterseniz özel olarak denemek istediğiniz tarihleri şu SQL kodu sayesinde de elde edebilirsiniz.

SELECT YEAR("2016-09-05 17:18:36");

Size istediğiniz değerleri döndürecektir. Evet şimdi örneğimize geri dönelim. 2011 yılında hangi aylarda veri olduğunu listeletecektik. Bunun için WHERE sorgusunda YEAR fonksiyonumuzu ve GROUP BY kısmında da MONTH fonksiyonumuzu kullanacağız. SQL sorgumuz şu şekilde olacak:

SELECT * FROM dersler WHERE YEAR(ders_tarih) = '2011' GROUP BY MONTH(ders_tarih)

Kodumuzu çalıştırdığımız zaman bize vereceği çıktı şu olacaktır:

+---------+-------------+---------------------+
| ders_id | ders_baslik | ders_tarih          |
+---------+-------------+---------------------+
|      12 | nFQ1iWI228  | 2011-09-25 07:37:03 |
|      27 | 0dd2hCtoid  | 2011-10-27 05:12:41 |
|      98 | krpYFBNC9Q  | 2011-11-27 00:27:21 |
|       7 | 7YJltQ5ULE  | 2011-12-13 03:52:03 |
+---------+-------------+---------------------+

Gördüğünüz gibi 9, 10, 11 ve 12. aylarda içeriklerimiz varmış sadece. İnanmıyorsanız yine sayabilirsiniz. Bu da böylece güzel bir örnek olmuş oldu. Şimdi isterseniz son bir örnek yapıp dersimizi bitirebiliriz.

Bu örneğimizde de 2013 yılındaki tüm verileri silelim. SQL kodumuz aynen şu şekilde olacak:

DELETE FROM dersler WHERE YEAR(ders_tarih) = '2013';

Bu kodu çalıştırdığımızda 2013 senesine ait bütün verileri silmiş oluyoruz. Son derece kullanışlı ve kullanması basit birkaç fonksiyon öğrendik bu dersimizde.

Eğer dersten yararlandıysanız, işinizi gördüyse, ilerde kullanacaksanız veya hoşunuza gittiyse hemen aşağıdaki Thank You butonuna basabilirsiniz. Bu size bir şey kaybettirmemenin yanı sıra bana da yeni içerikler hazırlamam konusunda moral ve motivasyon sağlayacaktır. Dersi okuduğunuz için teşekkür ederim, başka derslerde görüşmek üzere.

MySQL Mustafa Zahid Efe Yorum Yapılmamış