ورود

View Full Version : مشکل ذخیره تاریخ شمسی



mortaza94
سه شنبه 31 اردیبهشت 1392, 14:39 عصر
با سلام من امروز متوجه شدم وقتی تاریخی مثل 1392/2/30 را در نوع داده datatime2 خطا میدهد و دلیل آن این است که چون دومین ماه میلادی معمولا 28 یا 29 روز هست به خاطر همین خطا میدهد و اجازه نمی دهد این تاریخ را ذخیره کنم و چون پروژه من تقریبا آخرای کارش هست نمیتونم نوع داده رو varchar انتخاب کنم لطفا منو راهنمایی کنید چطور این مشکل را حل کنم

benyaminrahimi
سه شنبه 31 اردیبهشت 1392, 15:43 عصر
معلومه به خطا میخوره چون معادل این مقدار در datetime وجود نداره ... شما اگه میخاین نوع فیلدتون رو تغییر ندین باید معادل میلادی ذخیره کنید و سمت ui تبدیل به شمسیش کنید و برعکس معمولا کامپوننت های تاریخ این کارو میکنند ..و تو گزارشات هم با یه پروسیجر معادل شمسی رو در بیاری ...

البته اگه نوع رو varchar کنید فکر کنم راحتتر باشه براتون ... دوست من این مسایل رو اول پروژه روش فکر میکنن نه آخر پروژه

شاید این دوتا فاکشن به کارت بیاد



ALTER FUNCTION [dbo].[DateLatin](@DateFarsi CHAR(10))
RETURNS Date AS
BEGIN
declare @ret DATE

SET @ret=null

IF dbo.f_pub_tarikh_val_check(@DateFarsi) IS NOT null
begin


DECLARE @Days BigInt

DECLARE @Year_Farsi int
DECLARE @Month_Farsi int
DECLARE @Day_Farsi int

SET @Year_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 1, 4))
SET @Month_Farsi = CONVERT(int, SUBSTRING(@DateFarsi,6, 2))
SET @Day_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 9, 2))

SET @Days = ((@Year_Farsi - 1279) * 365) + ((@Year_Farsi - 1276) / 4)

IF @Month_Farsi <= 7
SET @Days = @Days + ((@Month_Farsi - 1) * 31)
ELSE
SET @Days = @Days + ((@Month_Farsi - 7) * 30) + 186

SET @ret= DATEADD(DAY, @Days + @Day_Farsi - 1, '19000320')
end
RETURN @ret
END





ALTER FUNCTION [dbo].[DateFarsi](@DateLatin AS DateTime)
RETURNS CHAR(10) AS
BEGIN
DECLARE @DateFarsi CHAR(10)

DECLARE @Days int
DECLARE @Tmp int

DECLARE @Year_Farsi int
DECLARE @Month_Farsi int
DECLARE @Day_Farsi int

SET @Days = DATEDIFF(DAY, '19000320', @DateLatin)

SET @Year_Farsi = 1279
SET @Month_Farsi = 01
SET @Day_Farsi = 01

SET @Tmp = @Days / 365

IF (@Tmp * 365) + ((@Tmp + 3) / 4) > @Days
SET @Tmp = @Tmp - 1
SET @Year_Farsi = @Year_Farsi + @Tmp
SET @Days = @Days - (@Tmp * 365) - ((@Tmp + 3) / 4)

IF @Days <= 186
BEGIN
SET @Tmp = @Days / 31
SET @Month_Farsi = @Month_Farsi + @Tmp
SET @Days = @Days - (@Tmp * 31)
END
ELSE
BEGIN
SET @Days = @Days - 186
SET @Tmp = @Days / 30
SET @Month_Farsi = @Month_Farsi + @Tmp + 6
SET @Days = @Days - (@Tmp * 30)
END
SET @Day_Farsi = @Day_Farsi + @Days

RETURN REPLACE(STR(@Year_Farsi, 4, 0) +'/'+
STR(@Month_Farsi, 2, 0) +'/'+
STR(@Day_Farsi,2, 0), ' ', '0')
END

mortaza94
سه شنبه 31 اردیبهشت 1392, 21:09 عصر
بله شما حق دارین چون من اولین تجربه برنامه نویسی هست تا حالا به این نکته توجه نکرده بودم
آیا میشه کاری کرد sql تاریخ شمسی رو تو datetime2 پشتیبانی کنه ؟

مهدی هادیان2
چهارشنبه 01 خرداد 1392, 16:57 عصر
بسم الله الرحمن الرحیم

با سلام من امروز متوجه شدم وقتی تاریخی مثل 1392/2/30 را در نوع داده datatime2 خطا میدهد و دلیل آن این است که چون دومین ماه میلادی معمولا 28 یا 29 روز هست به خاطر همین خطا میدهد و اجازه نمی دهد این تاریخ را ذخیره کنم و چون پروژه من تقریبا آخرای کارش هست نمیتونم نوع داده رو varchar انتخاب کنم لطفا منو راهنمایی کنید چطور این مشکل را حل کنم
با سلام
لطفا به تاپیک زیر سری بزنید.
http://forum.p30world.com/showthread.php?t=565180
موفق باشید.

علی فتحی
سه شنبه 11 شهریور 1393, 22:42 عصر
سلام بنده این کد شما را بارها و بارها توی تاپیک دیدم ولی به هیچ وجه نمیشه استفاده کرد ایا نمونه سورس یا بانک دارید همینجا بگذاریذ