نظردهنده: احمدي
خيلي خيلي ممنون
فقط يه سوال:
من ميخوام يك تاريخ مبدا و يك تاريخ نهايي از كاربر بگيرم و به ازاي هر روز بين اين دوتا تاريخ يك ركورد ثبت كنم چطور ميتونم اين كارو انجام بدم؟
پنجشنبه ۲۹ مرداد ۱۳۹۴ - ۱۰:۴۴ صبح
پاسخ: به اين ترتيب: 1. تاريخ را به اجزاي تشكيلدهنده خود تقسيم كنيد؛ روز، ماه، سال، به عدد كانورت كرده و در سه متغير عددي قرار دهيد. 2. حالا يك حلقه بسازيد كه تكرار شود. 3. در هر تكرار يك واحد به متغير روز اضافه نمايد. 4. كنترل كند ماه بين 0 تا 7 است (31 روزه) يا بين 6 تا 12 (30 روزه) يا 12. 5. اگر ماه 12 است آيا سال كبيسه است (از يك سال كبيسهاي به عنوان مبدأ منها شده و بر 4 تقسيم گردد و اگر باقيمانده صفر شد كبيسه است). 6. اگر روز از مقدار ممكن در ماه بيشتر شد، يكي به ماه اضافه شده و روز يك شود. 7. مقدار ماه اگر از 12 بيشتر شده يكي به سال اضافه شده و ماه يك شود. 8. اكنون تاريخ فعلي به دست آمده و بايد يك INSERT ساخته شده و ركورد ايجاد گردد. 9. با تاريخ مقصد مقايسه شود و اگر به مقصد رسيده است از لوپ خارج گردد. 10. كار تمام است، ميتواند يك پيغام مناسب بازگرداند. اين الگوريتم به نظرم كامل و روشن باشد. موفق باشيد.

در توضيح سوالم بايد بگم: اگه من تاريخ مبدا را 1/1/1394 در نظر بگيرم وقتي يكي يكي به اين تاريخ اضافه بكنم ،بخوام 1/2/1394 را ثبت كنم چكار بايد بكنم؟
پنجشنبه ۲۹ مرداد ۱۳۹۴ - ۱۰:۴۸ صبح
پاسخ: روشهاي متنوعي براي اين كار وجود دارد. اولاً ميتوانيد اين كار را در لايه برنامهنويسي با زباني كه كار ميكنيد، Net. يا php مثلاً انجام دهيد كه در آن صورت بايد يك مجموعه INSERT بسازيد و به يكباره يا بخشبخش اجرا بفرماييد. يا اينكه برويد در لايه SQL و يك تابع به زبان T-SQL بنويسيد؛ مبدأ و مقصد را بگيرد و در يك لوپ انداخته، تمام ركوردها را مستقيم بسازد. از سوي ديگر نحوه ذخيره داده تاريخ هم متنوع است. ممكن است بخواهيد يك فيلد (CHAR(10 بسازيد و تاريخ شمسي را در قالب يك رشته ذخيره كنيد، يا ممكن است برويد سراغ smalldatetime و به صورت ميلادي تاريخ را ذخيره كرده و سپس هر بار موقع SELECT كردن آن را دوباره به شمسي باز گردانيد. روشي هم وجود دارد كه با استفاده از كدهاي آمادهاي كه در اينترنت يافت ميشود يك فيلد از نوع تاريخ شمسي در ديتابيس ايجاد كنيد. هر كدام از اينها تكنيك خاص خود را دارد. موارد فوق را بررسي نموده، روش مناسب براي كار خود را بيابيد. موفق باشيد.

الگوريتم كامل بود ، ممنون
سهشنبه ۳ شهريور ۱۳۹۴ - ۸:۴۹ صبح
پاسخ: موفق باشيد.
سلام
اين كد را سال گذشته استفاده ميكردم درست كار ميكرد و لي امثال تاريخ ميلادي را كه به شمسي تغيير ميده تاريخ دو روز پيش را نشون ميدهو لطفا يه نگاه بهش بندازيد
سهشنبه ۱۷ فروردين ۱۳۹۵ - ۹:۲۹ صبح
پاسخ: سلام. صحيح ميفرماييد. اين به دليل محاسبه «كبيسه»هاست. سالهاي ميلادي كبيسههاي خاص خود را دارند و سالهاي شمسي نيز. غير از اينكه هر چهار سال يكبار ما كبيسه داريم، در يك بازه زماني كبيسههاي پنجساله اتفاق ميافتند. كد فوق را چند ماه پيش اصلاح كردم كه مشكل كبيسه آن حل شده است. يك كد جديد هم يك بزرگواري نوشتهاند كه خيلي سريعتر از كد فوق است. نشاني آن را در پينوشت هفتم مييابيد. ميتوانيد از آن استفاده كنيد كه قطعاً بسيار بهتر است. موفق باشيد.
سلام مجدد
كدي كه در لينك معرفي شده ، در سيستم من خطا ميگيره!
آيا لازمه كه كد ايشون اصلاح بشه؟ يا همين كد، كد نهايي هست؟
كه در اينصورت روي تعاريف متغير ها داراي اشكال هست
پنجشنبه ۱۹ فروردين ۱۳۹۵ - ۱:۰۵ عصر
پاسخ: سلام. احتمال ميرود فراموش فرموده باشيد كه كوتيشنماركهاي داخل اين كد را با نشان آپستروف جايگزين فرماييد. كوتيشنها دوتايي هستند، ولي آپستروف تكيست. اگر اين جايگزيني انجام نشود، كد خطا ميدهد. يك بررسي بفرماييد.

مشكل كوتيشن و تك كوتيشن نيست
شنبه ۲۱ فروردين ۱۳۹۵ - ۲:۴۵ عصر
پاسخ: من همين الآن كل كد موجود در لينك داده شده را كپي كردم در نوتپد، كوتيشنها را با آپستروف جايگزين كردم، بردم داخل اديتور SQL Server 2008 اجرا كردم. تابع SDAT ساخته شد. با كد ( SELECT [dbo].[SDAT] ("2016/04/09" , "") ) تست كردم، پاسخ داد ( شنبه 21 فروردين 1395 ) كه درست بود. شايد نسخه SQL شما متفاوت است يا دليل ديگري. موفق باشيد.

باسلام
كد معرفي شده با sql 2005 كار نميكنه
پنجشنبه ۲۶ فروردين ۱۳۹۵ - ۲:۰۳ عصر
پاسخ: سلام. ولي كدي كه در داخل همين پست وبلاگي نوشتهام و جديداً ويرايش و اصلاح كردم به نظرم با هر نگارشي از SQL كار كند، زيرا از دستورات عمومي و سادهاي استفاده ميكند. چند روز پيش تست كردم و تاريخ درست را خروجي داد. راستي، فراموش نفرماييد كه ما براي اولين بار در SQL 2008 حروف فارسي به صورت مستقل داريم (Persian-100) در حالي كه در 2005 از عربي استفاده ميشود. دو حرف ي و ك در عربي با فارسي تفاوت دارند. وقتي حروف «ي» و «ك» فارسي بخواهند مورد استفاده قرار بگيرند معمولاً دچار مشكل ميشوند. اين احتمال را هم بررسي بفرماييد، با توجه به اينكه در ابتداي تابع از حروف فارسي استفاده شده است. براي تست، ميتوانيد تمام بخشهاي فارسي داخل كد را موقتاً به انگليسي بر گردانيد و تست كنيد. اگر جواب داد مشكل از همين تفاوت فارسي و عربيست. موفق باشيد.

مچكرم
دوشنبه ۱۹ آذر ۱۳۹۷ - ۱۰:۱۶ صبح
پاسخ: در پناه خدا.