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 عصر
سلام بنده این کد شما را بارها و بارها توی تاپیک دیدم ولی به هیچ وجه نمیشه استفاده کرد ایا نمونه سورس یا بانک دارید همینجا بگذاریذ
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.