PDA

View Full Version : سوال: ذخيره كردن تاريخ شمسي در SQL SERVER2005



n@seri
دوشنبه 24 آبان 1389, 09:09 صبح
سلام. من براي ذخيره كردن تاريخ شمسي در SQL مشكل دارم.قبلا تاريخ رو به صورت nvarchar ذخيره مي كردم ولي در اين حالت موقع مقايسه دو تاريخ با هم و اجراي query با دستور between به مشكل مي خورم.
لطفا راهنماييم كنيد

Reza_Yarahmadi
دوشنبه 24 آبان 1389, 09:47 صبح
اگر تاريخ رو با فرمت ثابتي ذخيره كنيد مثلا 4 رقم سال ، 2 رقم ماه ، 2 رقم روز
چيزي مثل اين تاريخ 1389/08/01
اگر به اين صورت باشه با همون دستور Between بدون مشكل كار ميكنه.

Select * from TableName
Where
Date Between '1389/07/01' AND '1389/08/01'

ولي اگر تاريخ رو بصورت ميلادي ذخيره كنيد و از تبديلهاي ميلادي به شمسي براي نمايش و ذخيره استفاده كنيد به مراتب سرعت پردازش (در تعداد ركورد بالا) زياد ميشه

Rezahak
دوشنبه 24 آبان 1389, 09:48 صبح
سلام
فكر مي كنم تنها راه ذخيره تاريخ شمسي انتخاب فيلد از نوع char(8) ميباشد ولي در خصوص between شما دو راه حل داريد:
1- خودتان يك dll بنويسيد و انرا در sql وارد كنيد.
2 - فيلد ذخيره شده كه نوع آن char و محتويات آن عدد است را با استفاده از cast يا convert به نوع int تبديل كرده و بعد از between استفاده كنيد. البته در مورد نوع char هم نبايد با between مشكلي وجودداشته باشد . شايد شما از '' استفاده نكرده ايد!!!!!

حمیدرضاصادقیان
دوشنبه 24 آبان 1389, 10:05 صبح
سلام
فكر مي كنم تنها راه ذخيره تاريخ شمسي انتخاب فيلد از نوع char(8) ميباشد ولي در خصوص between شما دو راه حل داريد:
1- خودتان يك dll بنويسيد و انرا در sql وارد كنيد.
2 - فيلد ذخيره شده كه نوع آن char و محتويات آن عدد است را با استفاده از cast يا convert به نوع int تبديل كرده و بعد از between استفاده كنيد. البته در مورد نوع char هم نبايد با between مشكلي وجودداشته باشد . شايد شما از '' استفاده نكرده ايد!!!!!

سلام. این راههایی که شما گفتید هم میشه انجام داد ولی با راه حل جناب آقای یاراحمدی مشکل به راحتی حل میشه و نیازی نیست اینقدر کار رو سخت کنیم.
در ضمن اگر از Char 8 استفاده کنند شاید برای سال به مشکل بربخورند.(البته اگر دید آینده نگری در مورد نرم افزار هست) که باید از Char 10 استفاده کرد.

Rezahak
دوشنبه 24 آبان 1389, 10:11 صبح
در ضمن اگر از Char 8 استفاده کنند شاید برای سال به مشکل بربخورند.(البته اگر دید آینده نگری در مورد نرم افزار هست) که باید از Char 10 استفاده کرد.

منظورم از char(8) اين بود :
4 كاراكتر براي سال 2 كاراكتر براي ماه و دو كاراكتر براي روز (بدون/) مثل 13890101
اين طوري between هم قطعا درست كار مي كند چون اگر از جداكننده / استفاده كنيد و طول ماه و روز را بين 1 يا دو كاراكتر متغير قراردهيد چون مقايسه between از نوع كاراكتري خواهد بود در مورد طول رشته هاي متفاوت با اشكال همراه خواهد بود

n@seri
دوشنبه 24 آبان 1389, 11:46 صبح
اگر تاريخ رو با فرمت ثابتي ذخيره كنيد مثلا 4 رقم سال ، 2 رقم ماه ، 2 رقم روز
چيزي مثل اين تاريخ 1389/08/01
اگر به اين صورت باشه با همون دستور Between بدون مشكل كار ميكنه.

Select * from TableName
Where
Date Between '1389/07/01' AND '1389/08/01'

ولي اگر تاريخ رو بصورت ميلادي ذخيره كنيد و از تبديلهاي ميلادي به شمسي براي نمايش و ذخيره استفاده كنيد به مراتب سرعت پردازش (در تعداد ركورد بالا) زياد ميشه


ممنون از راهنمائيتون. مشكل من اين بود كه تاريخ رو به صورت 1/1/1389 مي نوشتم، براي همين query جواب درست نمي داد.