# پایگاه‌های داده > SQL Server > T-SQL >  تشخیص سال کبیسه شمسی

## asemoon barooni

سلام دوستان
من میخوام بدونم یک سال مشخص شمسی کبیسه هست یا نه؟؟ تو سرچ هام برای میلادی دیدم که از دو روش مختلف استفاده میشه : 
مثلا این تابع :
  Create  FUNCTION F_BIT_LEAP_YEAR
(@p_year SMALLINT)
RETURNS BIT
AS
BEGIN
    DECLARE @p_leap_date SMALLDATETIME
    DECLARE @p_check_day TINYINT
 
    SET @p_leap_date = CONVERT(VARCHAR(4), @p_year) + '0228'
    SET @p_check_day = DATEPART(d, DATEADD(d, 1, @p_leap_date))
    IF (@p_check_day = 29)
        RETURN 1

    RETURN 0  
END


روش دوم هم که اکثرا به این صورته :


CREATE FUNCTION [dbo].[fn_CheckLeapYear] ( @InputDate DATETIME )
RETURNS BIT
AS
BEGIN
IF ( YEAR(@InputDate) % 4 = 0
AND YEAR(@InputDate) % 100 != 0
)
OR YEAR(@InputDate) % 400 = 0
RETURN 1
RETURN 0
END

من میخوام برای سال کبیسه شمسی یه همچین تابعی بنویسم تو همین سایتم جستجو کردم  این تاپیک رو دیدم : https://barnamenevis.org/showthread.p...8C%D8%B3%D9%87
ولی نتونستم به نتیجه ای کلی برسم یعنی اگر باقیمانده تقسیم سال به 33 یکی از این عدد ها باشد : 1 و 5 و 9 و 13 و 17 و 22 و 26 و 30     	برای تشخیص سال کبیسه شمسی کافیه .. اگه دوستان در این زمینه راهنمایی کنید ممنون میشم .

----------


## یوسف زالی

ببینید من بر طبق نتیجه شما راه رو می گم:
select case when YearInIntType % 33 in(1, 5, 9, 13, 17, 22, 26, 30)then 'Kabise' else 'Mamuli' end as Result

----------


## asemoon barooni

ممنون از راهنماییتون من برای نوشتن تابع برای اون نتیجه ای که گفتم مشکلی ندارم سوالم این بود که برای تشخیص سال کبیسه همین شرط 


> باقیمانده تقسیم سال به 33 یکی از این عدد ها باشد : 1 و 5 و 9 و 13 و 17 و 22 و 26 و 30     	برای تشخیص سال کبیسه شمسی کافیه


 کافیه یا نه ما باید چیزای دیگه ای رو هم مدنظر قرار بدیم؟؟

----------


## یوسف زالی

شاید این کمکی کنه:
http://www.khabaronline.ir/news-50372.aspx

اما اگر جای شما بودم اضافات دقایق سال 365 رو محاسبه می کردم و اگر از یک روز بیشتر شد کبیسه می گرفتم.

این هم نحوه محاسبات:
http://cesikiu.persiangig.com/docume...8%A7%D9%84.htm

----------


## asemoon barooni

> http://cesikiu.persiangig.com/docume...8%A7%D9%84.htm


روش شمام از لینک بالا گرفته شده؟؟

----------


## یوسف زالی

شبیه همونه.
اما اون لینک به نظر بهتر میاد.

----------


## asemoon barooni

اگه امکان داره روش خودتونو بیشتر توضیح بدید؟ چون اون لینک خیلی وارد جزئیات شده و نیاز به بررسی زیاد داره....

----------


## یوسف زالی

ببینید شما طول دقیق یک سال شمسی رو بدست میارید. (حالا یا می دونید یا لحظات تحویل دو سال رو از هم کم می کنید)
مقدار اختلاف واقعی سال رو از تقویمی اون کم می کنید. (بر حسب ثانیه)
یک سال رو به عنوان سال مرجع قرار می دید. مثلا سال 1350. شما باید لحظه تحویل این سال رو هم بدونید. (یا با محاسبه یا اینترنت یا تقویم های دقیق قدیمی)
حالا به همون اندازه اختلاف ضرب در اختلاف تعداد سالهای مورد نظر با سال مبنا مقدار دقیقش رو اضافه می کنید.
اگر باقی مانده از یک روز بیشتر شد کبیسه هست.

Exact Value of a SolarYear = Xy
Diffrence between ExactValue and CalendarValue = Dy
Start of FirstPoint = Y0
Start of FirstPoint diffrence from calendar year = Dy0
Year that you want to calculate = Y

if (Dx * (Y - Y0) + Dy0) >= 86400 s = LeafYear

امیدوارم با این توضیح کلی مطلب دستتون اومده باشه.

----------


## asemoon barooni

ببخشید میخواستم علامت ؟ بذارم ولی هواسم نبود .. ممنون از راهنماییتون خیلی بهم کمک کردید.

----------

