Halâ Tasarım Aşamasında !
.com
Türkçe, Delphi ve SQL konusundaki deneyimler, örnek kodlar, eleştiri ve düşünceler...

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)

Hatırlatma

Bu sayfa test aşamasında olup deneysel veriler içermektedir.

EkleBunu Sosyal Paylaşım Butonu

Cıvıltılar

  • Herkes aynı fikirdeyse, hiç kimse yeterince düşünmüyor demektir
  • Beleş malın ömrü kısa olur
  • Bütün mucitler tembel olsaydı cilalıtaş devrine yeni girmiştik...
  • Çaresizlik insana icat yaptırır...
  • Yüzyılın Soykırımı
  • Sparkfun elektronik 7 Ocak 2010'da 1000 kişiye 100$ değerinde hediye dağıtacakmış...
  • Muharrem Ankara'da işbaşı yaptı, kendisine başarılı ve müreffeh bir iş hayatı diliyoruz :)
  • Erhan'a da huzurlu ve mutlu bir ömür diliyoruz.
  • MikroPascal'ın LCD kütüphanesinde ne tür bir sorun olabilir AÇAPAAAA! Nerede bu kodlar, nerede bu kaynak kodlar !!!

Sayfa Seç

1
Toplam 1 sayfa var. Siz 1. sayfadasınız ve 1 kayıt içinden 1 ile 1 arasını görmektesiniz

Yazı Miktarı

Bu sayfada kaç adet yazı görmek istiyorsunuz? Aşağıdakilerden birini seçiniz
1 2 3 5 10 15 20 30 50 75 100 200 300