PDA

View Full Version : چگونگی ذخیره تاریخ در دیتابیس+...



masoud0455
جمعه 05 خرداد 1391, 08:30 صبح
سلام
می خواستم بدونم بهترین روش ذخیره تاریخ در دیتابیس چیست؟
بعضی ها تاریخ رو میلادی ذخیره می کنن و بعد از خوندن از دیتابیس به شمسی تبدیل می کنن.
بعضی ها مستقیما شمسی ذخیره می کنن
بعضی ها از timestamp استفاده می کنن
بعضی ها هم روز و ماه و سال رو تو سه تا ستون مختلف ذخیره می کنن
مزایا و معایب هر کدوم چی هستن؟

من باید چکار کنم که بتونم بین رنج دو تاریخ اطلاعات از دیتابیس بگیرم؟

رضا قربانی
جمعه 05 خرداد 1391, 12:16 عصر
با توابع جلالی تاریخ رو در بانک ذخیره میکنی و موقع خوندن از بانک هم توسط تاریخ جلالی می خونی و به فارسی تبدیلش می کنی :

اینجا می تونی اطلاعاتی کسب کنید : http://barnamenevis.org/showthread.php?288698-%D9%87%D9%85%D9%87-%DA%86%DB%8C%D8%B2-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%A8%D8%A7-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%AC%D9%84%D8%A7%D9%84%DB%8C-%28%D8%AC%D8%AF%DB%8C%D8%AF%29&highlight=%D8%AC%D9%84%D8%A7%D9%84%DB%8C

MMSHFE
جمعه 05 خرداد 1391, 15:32 عصر
من خودم شخصاً timestamp رو ذخیره میکنم و هرجا لازم باشه، با تبدیلش به توابع میلادی یا شمسی یا قمری و... تاریخ رو با قالب مناسب نشون میدم. اینطوری چندتا مزیت داره:
1- حجم کمتر (فقط یک عدد int ذخیره میشه)
2- سرعت بیشتر در محاسبات
3- امکان انجام محاسبات ریاضی (مثل اضافه کردن تعداد ساعت دلخواه به زمان مربوطه یا کم کردن ثانیه های موردنظر و...)
4- قابلیت بررسی اینکه یک تاریخ، بین دو تاریخ دیگه هست یا نه.
5- عدم درگیری با مسائلی مثل ذخیره نشدن صحیح تاریخ فارسی در فیلدهای نوع DATETIME و...
-----
تابحال مشکلی با این روش نداشتم.

AbiriAmir
جمعه 05 خرداد 1391, 16:26 عصر
timestamp بهترین روشه
سرعتش هم به مراتب بیشتره

Unique
جمعه 05 خرداد 1391, 17:53 عصر
شما چه تاریخ را با timestamp چه با datetime خود database مثلا mysql ذخیره کنید برای نمایش فارسی باید از توابع تبدیل استفاده کنین ! به نظر من بهتره توابع در فرمت Datetime خود Mysql به صورت میلادی ذخیره بشوند که برای محاسبات داخل database خود Mysql کلی تابع محاسباتی داره ! اگر هم زمانی خواستین خیلی راحت میشه timestamp کردش ! در مورد حجم هم مطمئن باشین طراح های خود database بهترین نوع ذخیره تاریخ را انتخاب کرده اند و لازم نیست ما نوآوری از خودمون بکنیم !

AbiriAmir
جمعه 05 خرداد 1391, 18:06 عصر
شما چه تاریخ را با timestamp چه با datetime خود database مثلا mysql ذخیره کنید برای نمایش فارسی باید از توابع تبدیل استفاده کنین ! به نظر من بهتره توابع در فرمت Datetime خود Mysql به صورت میلادی ذخیره بشوند که برای محاسبات داخل database خود Mysql کلی تابع محاسباتی داره ! اگر هم زمانی خواستین خیلی راحت میشه timestamp کردش ! در مورد حجم هم مطمئن باشین طراح های خود database بهترین نوع ذخیره تاریخ را انتخاب کرده اند و لازم نیست ما نوآوری از خودمون بکنیم !

مثلا چه تابع محاسباتی داره؟

Unique
جمعه 05 خرداد 1391, 18:13 عصر
یه نگاه به لینک زیر بندازین :
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

masoud0455
جمعه 05 خرداد 1391, 22:30 عصر
با توابع جلالی تاریخ رو در بانک ذخیره میکنی و موقع خوندن از بانک هم توسط تاریخ جلالی می خونی و به فارسی تبدیلش می کنی :

اینجا می تونی اطلاعاتی کسب کنید : http://barnamenevis.org/showthread.php?288698-%D9%87%D9%85%D9%87-%DA%86%DB%8C%D8%B2-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%A8%D8%A7-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%AC%D9%84%D8%A7%D9%84%DB%8C-%28%D8%AC%D8%AF%DB%8C%D8%AF%29&highlight=%D8%AC%D9%84%D8%A7%D9%84%DB%8C
چه جوری تو دیتابیس جستجو کنم؟
چه جوری تو دیتابیس ذخیره کنم با سه تا ستون جداگونه؟ یا یک فیلد که سال و ماه و روز رو داره.
مشکل اصلی من تو بازیابی از دیتابیس به صورن رنجی است.مثلا از این تاریخ تا اون تاریخ.با چه دستور SQL ?

Unique
شنبه 06 خرداد 1391, 00:12 صبح
چه جوری تو دیتابیس ذخیره کنم با سه تا ستون جداگونه؟ یا یک فیلد که سال و ماه و روز رو داره.
این بدترین نوع ذخیره تاریخ در پایگاه هستش ! اما میشه با AND کردن و استفاده از علامت های بزرگتر و کوچکتر جستجو کرد بین دو تاریخ.

masoud0455
شنبه 06 خرداد 1391, 06:15 صبح
این بدترین نوع ذخیره تاریخ در پایگاه هستش ! اما میشه با AND کردن و استفاده از علامت های بزرگتر و کوچکتر جستجو کرد بین دو تاریخ.
یک ستون تو دیتابیس تعریف کردم با نوع Integer بعد با تابع ()jmktime سال و ماه و روز و ساعت و ... رو توش به صورت Timestamp ذخیره کردم.
چه جوری از تابع () jgetdate خروجی سال و ماه و روز رو به صورت تک تک بگیرم؟
با دستور print_r کل آرایه با اندیس ها چاپ میشه.

masoud0455
شنبه 06 خرداد 1391, 09:14 صبح
من خودم شخصاً timestamp رو ذخیره میکنم و هرجا لازم باشه، با تبدیلش به توابع میلادی یا شمسی یا قمری و... تاریخ رو با قالب مناسب نشون میدم. اینطوری چندتا مزیت داره:
1- حجم کمتر (فقط یک عدد int ذخیره میشه)
2- سرعت بیشتر در محاسبات
3- امکان انجام محاسبات ریاضی (مثل اضافه کردن تعداد ساعت دلخواه به زمان مربوطه یا کم کردن ثانیه های موردنظر و...)
4- قابلیت بررسی اینکه یک تاریخ، بین دو تاریخ دیگه هست یا نه.
5- عدم درگیری با مسائلی مثل ذخیره نشدن صحیح تاریخ فارسی در فیلدهای نوع DATETIME و...
-----
تابحال مشکلی با این روش نداشتم.
میشه یه sql_query برای مورد 4 که فرمودید مثال بزنید؟ ( فرضا به تاریخ به صورت timestamp تو یه فیلد integer ذخیره کردم)

MMSHFE
شنبه 06 خرداد 1391, 12:08 عصر
$start = strtotime('2012/03/05');
$end = strtotime('2012/04/05');
$query= mysql_query("SELECT * FROM `table` WHERE (`dt`>='{$start}' AND `dt`<='{$end}')");

masoud0455
شنبه 06 خرداد 1391, 12:20 عصر
$start = strtotime('2012/03/05');
$end = strtotime('2012/04/05');
$query= mysql_query("SELECT * FROM `table` WHERE (`dt`>='{$start}' AND `dt`<='{$end}')");

به نظر شما بهتر نیست فیلد تاریخ به صورت INT باشه ولی timestamp ذخیره کرد.چون تو mysql نوع (timestamp) به صورت datetime هست.

MMSHFE
شنبه 06 خرداد 1391, 12:45 عصر
من که اولش گفتم بصورت int ذخیره کنیم. نوع timestamp خود MySQL برای این روش ذخیره سازی مناسب نیست. باید از همون int استفاده بشه.

MMSHFE
شنبه 06 خرداد 1391, 12:47 عصر
چه جوری از تابع () jgetdate خروجی سال و ماه و روز رو به صورت تک تک بگیرم؟
یکبار با var_dump خروجی بگیرین و ببینید اسامی اندیسها چیه (مثلاً year و...) و بعد مشابه مثال زیر کار کنید:

echo $date['year'].'/'.$date['month'].'/'.$date['day'];
موفق باشید.

masoud0455
شنبه 06 خرداد 1391, 13:53 عصر
من که اولش گفتم بصورت int ذخیره کنیم. نوع timestamp خود MySQL برای این روش ذخیره سازی مناسب نیست. باید از همون int استفاده بشه.
شما خیلی آقایی ولی جواب ایمیلم رو ندادی ولی No Problem:لبخند:

AbiriAmir
شنبه 06 خرداد 1391, 21:30 عصر
یه نگاه به لینک زیر بندازین :
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

تمام اینا رو به راحتی با int میشه انجام داد
یکیشو بگین که نشه یا سخت باشه

MMSHFE
شنبه 06 خرداد 1391, 22:26 عصر
شما خیلی آقایی ولی جواب ایمیلم رو ندادی ولی No Problem:لبخند:
موضوع ایمیلیتون چی بود؟

adelavr
شنبه 12 اردیبهشت 1394, 16:21 عصر
timestamp بهترین روشه
سرعتش هم به مراتب بیشتره

اگه بخوایم یه تاریخ ساخت و یه تاریخ ادیت رو واسه پستها و تاپیکها داشته باشیم بایستی دوتا TimeStamp داشته باشیم که خاصیت Update دومی رو فعال بکنیم اما تو هر جدول فقط اجازه ساخت یک timestamp وجود داره این یعنی باید واسه ذخیره تاریخ ادیت هر پست ، نمیشه از timeStamp استفاده کرد و بایستی کد اون رو به صورت دستی با جلالی دربیاریم و به صورت dateTime ذخیره کنیم , درسته ؟؟
هیچ راهی واسه ایجاد دوتا timeStamp در یه جدول وجود نداره؟

MMSHFE
شنبه 12 اردیبهشت 1394, 21:48 عصر
نوع فیلد رو timestamp نگذارین چون با ساختار داخلی خود MySQL و بصورت یک متن ذخیره میشه و توی PHP هم همونطوری میاد و باید با strtotime دوباره به Timestamp تبدیل کنید. نوع فیلدها رو int بگذارین و برای بروزرسانی آپدیت هم از خود PHP کمک بگیرین و با تابع time بیاین timestamp جاری رو بگیرین و توی فیلد update_time (یا هر اسم دیگه که براش گذاشتین) ذخیره کنید.

MMSHFE
شنبه 12 اردیبهشت 1394, 21:49 عصر
ضمناً تاپیک سه سال قبل رو بالا نیارین. تاپیک قفل شد.