PDA

View Full Version : تشخیص سال کبیسه شمسی



asemoon barooni
شنبه 10 دی 1390, 10:05 صبح
سلام دوستان
من میخوام بدونم یک سال مشخص شمسی کبیسه هست یا نه؟؟ تو سرچ هام برای میلادی دیدم که از دو روش مختلف استفاده میشه :
مثلا این تابع :
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

من میخوام برای سال کبیسه شمسی یه همچین تابعی بنویسم تو همین سایتم جستجو کردم این تاپیک رو دیدم : http://barnamenevis.org/showthread.php?55239-تشخیص-سال-کبیسه-شمسی&highlight=%D8%B3%D8%A7%D9%84+%DA%A9%D8%A8%DB%8C%D8 %B3%D9%87
ولی نتونستم به نتیجه ای کلی برسم یعنی اگر باقیمانده تقسیم سال به 33 یکی از این عدد ها باشد : 1 و 5 و 9 و 13 و 17 و 22 و 26 و 30 برای تشخیص سال کبیسه شمسی کافیه .. اگه دوستان در این زمینه راهنمایی کنید ممنون میشم .

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

asemoon barooni
شنبه 10 دی 1390, 11:11 صبح
ممنون از راهنماییتون من برای نوشتن تابع برای اون نتیجه ای که گفتم مشکلی ندارم سوالم این بود که برای تشخیص سال کبیسه همین شرط
باقیمانده تقسیم سال به 33 یکی از این عدد ها باشد : 1 و 5 و 9 و 13 و 17 و 22 و 26 و 30 برای تشخیص سال کبیسه شمسی کافیه کافیه یا نه ما باید چیزای دیگه ای رو هم مدنظر قرار بدیم؟؟

یوسف زالی
شنبه 10 دی 1390, 11:29 صبح
شاید این کمکی کنه:
http://www.khabaronline.ir/news-50372.aspx

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

این هم نحوه محاسبات:
http://cesikiu.persiangig.com/document/%D8%AA%D9%82%D9%88%DB%8C%D9%85%20%D8%A7%DB%8C%D8%B 1%D8%A7%D9%86%DB%8C%20%D8%A8%D8%B1%D8%A7%DB%8C%203 000%20%D8%B3%D8%A7%D9%84.htm

asemoon barooni
شنبه 10 دی 1390, 12:48 عصر
http://cesikiu.persiangig.com/docume...8%A7%D9%84.htm (http://cesikiu.persiangig.com/document/%D8%AA%D9%82%D9%88%DB%8C%D9%85%20%D8%A7%DB%8C%D8%B 1%D8%A7%D9%86%DB%8C%20%D8%A8%D8%B1%D8%A7%DB%8C%203 000%20%D8%B3%D8%A7%D9%84.htm)
روش شمام از لینک بالا گرفته شده؟؟

یوسف زالی
شنبه 10 دی 1390, 13:42 عصر
شبیه همونه.
اما اون لینک به نظر بهتر میاد.

asemoon barooni
یک شنبه 11 دی 1390, 08:18 صبح
اگه امکان داره روش خودتونو بیشتر توضیح بدید؟ چون اون لینک خیلی وارد جزئیات شده و نیاز به بررسی زیاد داره....

یوسف زالی
یک شنبه 11 دی 1390, 08:56 صبح
ببینید شما طول دقیق یک سال شمسی رو بدست میارید. (حالا یا می دونید یا لحظات تحویل دو سال رو از هم کم می کنید)
مقدار اختلاف واقعی سال رو از تقویمی اون کم می کنید. (بر حسب ثانیه)
یک سال رو به عنوان سال مرجع قرار می دید. مثلا سال 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
یک شنبه 11 دی 1390, 11:57 صبح
ببخشید میخواستم علامت ؟ بذارم ولی هواسم نبود .. ممنون از راهنماییتون خیلی بهم کمک کردید.