none
SQL Verilen Yil ve Ay bilgisinden geriye Tarih bilgisi alabilmek ? RRS feed

  • Soru

  • SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO

    CREATE FUNCTION dbo.TarihBirlestir (@PMonth int , @PYear int
    )
    RETURNS DateTime
    AS
    BEGIN
     Declare @CCDate varchar(10)
     Declare @PDay int
     Declare @CurDate SmallDateTime
     Set @PDay= Datepart(dd, getdate());
     Set @CCDate= CONVERT(varchar(2),@PDay)+'.'+CONVERT(varchar(2),@PMonth)+'.'+CONVERT(varchar(4),@PYear);
     Set @CurDate= CONVERT(SmallDateTime, @CCDate);
        RETURN (@CurDate);
    END

    -------------------------------------------------------------

    Arkadaslar yukarida gibi bir fonksiyon kullaniyorum, bu Fonksiyon hangi SQL serverda calisirsa calissin oradaki tarih formatina gore veri dondurmesi lazim.

    Parameter olarak gecilen Ay ve YIL bilgisinden sonra bana tarih formatinda ve o gunu icerine bir sonuc dondurebilmeli.

    DMY formatinda olur ise 05/31/2013 ben USA formati kullaniyorum ama baska bir SQL server ISO formati kullaniyor ise 31/05/2013 gibide cevirebilmeli ...

    Ben donusturme hatasi aliyorum neden aldigimida biliyorum 

    The conversion of a varchar data type to a smalldatetime data type resulted in an out-of-range value.

    Benim kullandigim SQL server tarih formati farkli ama baska bir serverda calisirken o serverinkide farkli olabiliyor bende bu fonksiyonu oyle bir hazirlamaliyim ki her turlu tarih formatina uysun.

    Ayrica SQL servera connection kurarken Set Dateformat DMY diye komutta gonderiyorum ama yinede ayni hatayi almaya devam ediyorum. Gun alanina manuel olarak '31' yazdigimda sorun olmuyor hatanin sebebi belli yukaridaki dizilimi Ay gun Sene seklinde yaparsam ok oluyor ama bu seferde baska serverda sorun cikiyor. Bana oyle bir fonksiyon olsun ki her turlu sekilde dogru soncu dondurebilsin.

    30 Mayıs 2013 Perşembe 22:01

Yanıtlar

  • Merhaba,

    Sunucu tarafında tarih formatından bağımsız olmak için daha genel bir yöntem kullanmalısınız.

    SQL Server 2012 kullanıyorsanız zaten DATEFROMPARTS, DATETIMEFROMPARTS gibi parametrik olarak tarih değeri oluşturma fonksiyonları mevcut.

    SQL Server 2008 R2 ve öncesi için aşağıdaki çok pratik kodu kullanabilirsiniz. Bu ve benzer çözümlere internet forumlarında rastlamak mümkün, ben de stackoverflow'dan aldım.

    SELECT DATEADD(mm, (@year - 1900)*12 + @month - 1 , @day - 1)

    Bu çözümün sizin fonksiyonunuza uyarlaması şöyle olacaktır:

    CREATE FUNCTION dbo.TarihBirlestir (@PMonth int , @PYear int)
     RETURNS DateTime
     AS
     BEGIN
      Declare @CurDate SmallDateTime
      Declare @PDay int
      Set @PDay = DATEPART(dd, GETDATE());
      Set @CurDate = DATEADD(mm, (@PYear - 1900)*12 + @PMonth - 1 , @PDay - 1);
     RETURN (@CurDate);
     END

    Bu fonksiyon hatalı parametrelere de toleranslıdır. Örneğin bugün fonksiyonu 2 ve 2012 parametrelerini vererek çalıştırırsanız hata mesajı yerine 2012 Şubat ayının son gününü döndürecektir. Uygulama konusuna göre bu bir avantaj olabilir.

    İşinize yaraması dileğiyle..


    31 Mayıs 2013 Cuma 05:30

Tüm Yanıtlar

  • Merhaba,

    Sunucu tarafında tarih formatından bağımsız olmak için daha genel bir yöntem kullanmalısınız.

    SQL Server 2012 kullanıyorsanız zaten DATEFROMPARTS, DATETIMEFROMPARTS gibi parametrik olarak tarih değeri oluşturma fonksiyonları mevcut.

    SQL Server 2008 R2 ve öncesi için aşağıdaki çok pratik kodu kullanabilirsiniz. Bu ve benzer çözümlere internet forumlarında rastlamak mümkün, ben de stackoverflow'dan aldım.

    SELECT DATEADD(mm, (@year - 1900)*12 + @month - 1 , @day - 1)

    Bu çözümün sizin fonksiyonunuza uyarlaması şöyle olacaktır:

    CREATE FUNCTION dbo.TarihBirlestir (@PMonth int , @PYear int)
     RETURNS DateTime
     AS
     BEGIN
      Declare @CurDate SmallDateTime
      Declare @PDay int
      Set @PDay = DATEPART(dd, GETDATE());
      Set @CurDate = DATEADD(mm, (@PYear - 1900)*12 + @PMonth - 1 , @PDay - 1);
     RETURN (@CurDate);
     END

    Bu fonksiyon hatalı parametrelere de toleranslıdır. Örneğin bugün fonksiyonu 2 ve 2012 parametrelerini vererek çalıştırırsanız hata mesajı yerine 2012 Şubat ayının son gününü döndürecektir. Uygulama konusuna göre bu bir avantaj olabilir.

    İşinize yaraması dileğiyle..


    31 Mayıs 2013 Cuma 05:30
  • Cok tesekkurler bu sekilde sikinti yaratmiyor ilk bakista -1900*12 nedir diye anlamadim hatta hesap makinesi ilede bir mantikli sonuc alamamistim fakat neticede calisiyor.. Ama hazirciliktan ziyade yazilani anlamak isterim. Neden ya ve gunde -1 var ve neden -1900*12 var gibi.

    Tesekkurler;

    31 Mayıs 2013 Cuma 11:24
  • Rica ederim. İşinizi görmesine sevindim.

    DATEADD fonksiyonu bir tarihi referans alarak, ilk parametre olarak verilen zaman birimini ikinci parametrede verilen miktar kadar ekler. Çözüm buna dayanıyor.

    1900 yılının başı ile istenen ay-yıl arasındaki ay farkı + gün farkı kadar 1900 yılına ekleniyor. İşte "fark" kadar eklenebilmesi için -1 var.

    Belki zaten öyle yapıyorsunuz bilemiyorum ama tarih alanlarını veritabanında da işlerken de uygun tarih tipinde tutmanızı tavsiye ederim. Uyumluluk, hız, temiz kod gibi birçok avantajı olacaktır. Tarihi metin tiplerinde tutmak veya işlemek uzak durulması gereken kötü bir pratiktir.

    Saygılar.


    • Düzenleyen Usanmaz 31 Mayıs 2013 Cuma 18:08 ufak tashih
    31 Mayıs 2013 Cuma 18:07