En iyi yanıtlayıcılar
SQL Verilen Yil ve Ay bilgisinden geriye Tarih bilgisi alabilmek ?

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.
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..
- Düzenleyen Usanmaz 31 Mayıs 2013 Cuma 05:36 açıklama ekledim
- Yanıt Olarak Öneren Ali Rıza İnceoğlu 31 Mayıs 2013 Cuma 11:39
- Yanıt Olarak İşaretleyen Ali Rıza İnceoğlu 3 Haziran 2013 Pazartesi 07:16
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..
- Düzenleyen Usanmaz 31 Mayıs 2013 Cuma 05:36 açıklama ekledim
- Yanıt Olarak Öneren Ali Rıza İnceoğlu 31 Mayıs 2013 Cuma 11:39
- Yanıt Olarak İşaretleyen Ali Rıza İnceoğlu 3 Haziran 2013 Pazartesi 07:16
-
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;
-
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