PDA

View Full Version : اختلاف مبدا تاریخ SQL Server با زبان برنامه نویسی !



siamak-s
دوشنبه 07 فروردین 1391, 01:32 صبح
سلام دوستان.

من دچار یک مشکل بسیار تعجب برانگیزی شدم، خواستم تا موضوع رو در اینجا مطرح کنم تا صحت اون رو اول مطمئن بشم و در صورت اطمینان راه حلی برای اون جویا بشم.
به نظر شما چرا مبدا تاریخ در SQL Server و زبان برنامه نویسی من اختلاف دارند ؟! خروجی های من به صورت زیر هستند:


SQL Server:
SELECT CONVERT(DATETIME , 0) -- 1900-01-01 00:00:00.000
SELECT CAST(0 AS DATETIME) -- 1900-01-01 00:00:00.000

Visual Basic 6:
CDate(0) '1899/12/30

Visual Basic .NET:
DateTime.FromOADate(0) '1899/12/30

Visual C++:
DateTime::FromOADate(0).ToString() // 12/30/1899 12:00:00 ق.ظ


این قضیه در دوتا سیستم تست شده یکی با SQL Server 2000 و Windows Server 2003 و دیگری هم با SQL Server 2008 و Windows 7 ولی درهر دو خروجی همین فرم بود. این اختلاف تاریخ دو روز واقعا کلافه کنندست و دراین پروژه با واسطه شرایط خاصش من رو کلافه کرده. ممنون میشم اگه اولا امتحان کنید ببینید چنین چیزی صحت داره و در هر حال چه مشکل ریشه ای هست و یا مشکل از کار من راه حلی رو ارائه کنید.

برای اینکه امتحان کنید اگر مشکلی داشتید جای صفرها یک بزارید. فقط امیدوارم در تالار اشتباهی این تاپیک رو نزده باشم چون برای خودم هم ماهیتش مشخص نیست!

micro24
دوشنبه 07 فروردین 1391, 10:46 صبح
سلام

Select ای که شما می زنید روی Local خودتان می زنید یا به سروری این select را می زنید؟، برنامه روی سیستم خودتان می باشد؟

siamak-s
دوشنبه 07 فروردین 1391, 12:59 عصر
نرم افزار بر روی همون سرور SQL اجرا میشه، در حقیقت Select روی Local انجام میشه.
جالب هست بدونید که یه مقدار تحقیقات بیشتر انجام داد دیدم که این جدی جدی یک باگ هست! تو لینک های زیر می تونید این مشکل رو ببینید

http://stackoverflow.com/questions/1511418/how-to-set-the-base-time-for-datetime-in-iis-asp-for-compatibility-mode
http://forums.asp.net/t/1442591.aspx/1

همین طور یک مقاله جالب در مورد همین باگ (خیلی جالب هست):
http://www.inc.com/magazine/20080701/how-hard-could-it-be-glory-days.html

حالا با این اوصاف میخوام بدونم آیا واقعا راهی نیست؟ جز اینکه این اختلاف دو روز رو در تمامی محاسبات لحاظ کرد؟ خیلی موضوع مسخره ای هست چون که من باید تقریبا تمام پروژه رو زیر رو کنم تا این دو روزو لحاظ کنم!

micro24
دوشنبه 07 فروردین 1391, 13:15 عصر
بله من تست گرفتم همین مشکل دارد به این صورت تغییر دادم تا مثل هم شد.
DateTime.FromOADate(2)

siamak-s
دوشنبه 07 فروردین 1391, 13:32 عصر
خوب مشکل اینجاست که من تعداد زیادی Stored Procedure در داخل دیتابیسم دارم که برای کوئری هاشون از تاریخ داخلی SQL Server استفاده می کنند و بر اساس اون رکوردها رو Fetch می کنند، این در حالی هست که رکوردها از طریق برنامه وارد دیتابیس شدند و اینجاست که مشکل پیش میاد. این طوری که به نظر میاد راهی نیست جز تغییر همه ی اون sp ها!
واقعا اینکه یک شرکت با اون همه عظمتش دو تا محصولی تولید کنه که در واقع اصلا برای کار با یکدیگر تولید شدند ولی در یک موضوع ساده و ابتدایی اونم مبدا تاریخ اختلاف داشته باشند واقعا جای شگفتی داره! باید تحسین کرد!

micro24
دوشنبه 07 فروردین 1391, 14:00 عصر
لطفاً مقداری بیشتر توضیح دهید می خواهید چه کاری انجام بدهید چه تاریخی را از طریق برنامه می خواهید به sp ارسال نمائید؟ مثلاً تاریخ روز جاری را به میلادی می خواهید به sp ارسال کنید؟

siamak-s
دوشنبه 07 فروردین 1391, 15:11 عصر
شما فرض کنید Stored Procedure ای داریم که قرار هست رکوردهایی که تاریخ انقضای اون ها نگذشته رو برگردونه.

micro24
دوشنبه 07 فروردین 1391, 18:54 عصر
امیدوارم درست متوجه شده باشم،اگر تاریخی که توی برنامه دارید فارسی هست و می خواهید به میلادی تبدیل کنید این تاپیک شاید بتواند شما را کمک کند
http://barnamenevis.org/showthread.php?162769-%D9%85%D8%B4%DA%A9%D9%84-%D8%A7%D8%B3%D8%A7%D8%B3%DB%8C-%D8%A8%D8%A7-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE

توی همین سایت اگر جستجو کنید تاپیک هایی را می توانید پیدا کنید اول تاریخ را به میلادی تبدیل کنید بعد به sp خود ارسال کنید داخل sp هم کد خود را طوری بنویسید که تاریخ انقضای شما بزرگتراز تاریخی که ارسال کردید باشد یعنی
where column(engheza)>tarikhikebespersalmishe

siamak-s
سه شنبه 08 فروردین 1391, 00:43 صبح
من مشکلی با تبدیل تاریخ شمسی به میلادی ندارم! شما اصلا تاریخ شمسی رو کاری نداشته باش. شما فرض کن هر رکورد یه فیلد تاریخ داره به میلادی (حالا یا نوع اون دقیقا DateTime هست و یا Int) ، کاربر موقع درج مقادیر اولیه این تاریخ رو هم تنظیم می کنه برای اون رکورد، حالا شما در جای دیگه یک Stored Procedure نوشتید که می خواهید رکوردهایی که از تاریخ امروز به بعد هستند برگردونده شن! اینجاست که اگر تاریخی که به عنوان معیار برای Fetch کردن رکوردها استفاده میشه تاریخ SQL Server باشه، به دلیل اینکه مبدا اون با مبدا تاریخ در برنامه شما (زبان برنامه نویسی شما) متفاوت هست (اختلاف دو روزی که در بالا گفته شد) به مشکل بر می خورین.
شما همونی که تست کردید و متوجه شدید مشکل داره رو تصور کنید در یک پروژه با مقیاس بزرگتر بخواهید برطرف کنید.