T-SQL ile Dakikayı Metne Çevirmek
- 23 Kasım 2009 Pazartesi
- Uğur Parlayan
Bazı işleri veritabanına yaptırmak uygulamalara zaman kazandırabiliyor... Veriler üzerinde süre hesaplamak da bunların arasında sayılabilir, çünkü uygulama üzerinde süre hesaplamaktansa veritabanı tablosunu çekerken sürenin hesaplanmış olarak gelmesi hem hız, hem de performans açısından daha kârlıdır. Bununla birlikte bu tür işlere giriştiğinizde sunucunuzun da güçlü olması sıkıntılarınızı azaltabilir...
Aşağıda tanıtacağım kod, dakika (tamsayı) cinsinden verilen bir süreyi "Yıl + Ay + Gün + Saat + Dakika" cinsinden yazabilmenizi sağlıyor. Bir nevi dakikayı okunabilir bir metne çeviriyor. Kıytırık bir iş gibi gözükebilir fakat bu tür küçük şeylerle uğraşmak büyük sistemlerde kodların okunabilirliğini ve hataların çabuk giderilmesini sağlaması açısından gayet faydalıdır.
Şu an kullanmakta olduğumuz takvim konusundaki bilgiyi vikipedi'den edinebilirsiniz. Gevelemeden koda geçelim;
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
/********************************************************************************\
|* Dakika cinsinden süreyi metne çevirir. Küllim beleş ve paylaşıma açıktır... *|
|* Uğur PARLAYAN © 23.11.2009 Pazartesi *|
\********************************************************************************/
ALTER FUNCTION [dbo].[FN_STR_SureYaz] ( @Parametre INT )
RETURNS VARCHAR(MAX)
AS BEGIN
DECLARE @Sonuc VARCHAR(MAX)
, @ToplamDakika INT
, @ArtanDakika INT
, @ToplamSaat INT
, @ArtanSaat INT
, @ToplamGun INT
, @ArtanGun INT
, @ToplamAy INT
, @ArtanAy INT
, @ToplamYil INT
SELECT @ToplamDakika = ISNULL(@Parametre, 0) /* Tutarlılık için küçük bir önlem :) */
, @ArtanDakika = @ToplamDakika % 60
, @ToplamSaat =(@ToplamDakika - @ArtanDakika) / 60
, @ArtanSaat = @ToplamSaat % 24
, @ToplamGun =(@ToplamSaat - @ArtanSaat) / 24
, @ArtanGun = @ToplamGun % 30.436875
, @ToplamAy =(@ToplamGun - @ArtanGun) / 30.436875
, @ArtanAy = @ToplamAy % 12
, @ToplamYil =(@ToplamAy - @ArtanAy) / 12
SELECT
@Sonuc = CASE WHEN @Parametre<=0 THEN 'yok'
ELSE CASE WHEN @ToplamYil > 0 THEN CAST(@ToplamYil AS VARCHAR)+' yıl ' ELSE '' END
+ CASE WHEN @ArtanAy > 0 THEN CAST(@ArtanAy AS VARCHAR)+' ay ' ELSE '' END
+ CASE WHEN @ArtanGun > 0 THEN CAST(@ArtanGun AS VARCHAR)+' gün ' ELSE '' END
+ CASE WHEN @ArtanSaat > 0 THEN CAST(@ArtanSaat AS VARCHAR)+' saat ' ELSE '' END
+ CASE WHEN @ArtanDakika>0 THEN CAST(@ArtanDakika AS VARCHAR)+' dk' ELSE '' END
END
RETURN (RTRIM(@Sonuc))
END
Şimdi bir de bu fonksiyonun nasıl kullanıldığına dair kısa ve öz bir kaç örnek verelim...
/* Mesela 1 Ocak 1753'den şimdiye kadar olan süreyi yazdıralım */
SELECT dbo.FN_STR_SureYaz(DATEDIFF(minute,'17530101',GETDATE())) as [Geçen Süre]
/* Veya belli iki tarih arasındaki süreyi yazdıralım */
SELECT dbo.FN_STR_SureYaz(DATEDIFF(minute,'20090101','20091010')) as [Geçen Süre]
Geçen Süre
---------------------------------
256 yıl 7 ay 22 gün 14 saat 12 dk
(1 row(s) affected)
Geçen Süre
---------------------------------
9 ay 7 gün
(1 row(s) affected)