سلام دوستان 🙂
برای برنامه نویسان php معمولا سوال است که به چه صورتی می توان تاریخ و زمان را در دیتابیس ذخیره و بازیابی کرد .برای آن سه راه حل وجود دارد ولی ابتدا مشکل :
php در تمام توابع زمانی خود از unix timestamp استفاده می کند.این توابع می توانند timestamp ها را به اشکال زیباتری که شما می خواهید نیز نمایش دهند ولی به صورت داخلی از خود timestamp استفاده می کنند.منظور از timestamp یک سری اعداد ساده به صورت integer است .در یک توضیح جزئی تر ، این اعداد تعداد ثانیه هایی هستند که از نیمه شب 1 ژوئن 1970 تا به این لحظه گذشته است (مبدا گرینویچ) .
mysql نیز از سه نوع تاریخ پشتیبانی می کند.یعنی DATETIME, DATE, و TIMESTAMP.نوع DATETIME تاریخ و زمان را در قالب یه رشته متنی به صورت YYYY-MM-DD HH:MM:SS ذخیره می کند (مانند: 2006-12-25 13:43:15) .نوع DATE فقط شامل بخش تاریخ نوع قبلی است – YYYY-MM-DD (مانند: 2006-12-25) .نوع TIMESTAMP نیز بر خلاف اسمش اصلا ربطی به unix timestamp ای که در php استفاده می شود ندارد.نوع TIMESTAMP در اینجا دقیقا مثل DATETIME عمل می کند با این تفاوت که هر موقع محتویات رکورد تغییر یابند خود به خود زمان را بروز می کند(این توضیح مختصر و نسبتا درستی است ولی جزئیات زیاد مهم نیستند).اما از MySQL 4.1 نوع TIMESTAMP دقیقا شبیه DATETIME شده است.
پس مشکل این است که چگونه با این انواع تاریخ در کنار هم استفاده کنیم.timestamp ها در php از نوع integer و در mysql نیز DATETIME از نوع رشته ای هستند .سه راه حل برای این مشکل وجود دارد :
1.یک راه حل عمومی این است که تاریخ را به صورت DATETIME ذخیره کنیم یعنی با استفاده از توابع ()date
و ()strtotime
آن را به صورت قابل قبول در mysql در آوریم.به این صورت :
$mysqldate = date( 'Y-m-d H:i:s', $phpdate ); $phpdate = strtotime( $mysqldate );
2.راه حل دوم این است که به MySQL اجازه دهیم کار خودش را انجام دهد.MySQL توابعی دارد که می توانیم در مواقع نیاز از انها برای تبدیل تاریخ استفاده کنیم.تابع UNIX_TIMESTAMP
از DATETIME در MySQL به timestamp در PHP تبدیل می کند و تابع FROM_UNIXTIME
بر عکس یعنی timestamp در php را به DATETIME تبدیل می کند.از این توابع می توان در داخل query به صورت زیر استفاده کرد:
$query = "UPDATE table SET datetimefield = FROM_UNIXTIME($phpdate) WHERE..."; $query = "SELECT UNIX_TIMESTAMP(datetimefield) FROM table WHERE...";
3.و سومین و آخرین راه این است که به صورت ساده همه جا از همان timestamp خود php استفاده کنیم یعنی چون این نوع تاریخ و زمان یک integer ساده است می توانیم به راحتی آن را در داخل یک فیلد int ذخیره کنیم.خوبی اسن روش سادگی آن است و دیگر نیازی به تبدیل به یکدیگر نیست وفقط با یک مقدار چند رقمی عدد کار می کنیم.
اما توجه کنید که اگر زمان را به صورت یک عدد ساده در mysql ذخیره کنیم خودمان را از کارایی mysql برای کار با تاریخ و زمان محروم کرده ایم ، زیرا mysql نمی داند که این ارقام ما تاریخ هستند نه شماره شناسنامه یا تلفن !
با این حال اگر از دیتابیس فقط برای ذخیره داده ها استفاده می کنید و تمام عملیات ها را در php انجام می دهید ، این گزینه می تواند کارامد باشد.
در انتها ببینیم کدام یک برای استفاده ما بهتر است .اگر شما نیازی به دستکاری تاریخ ها در خود mysql ندارید ، گزینه آخری می تواند بهترین راه باشد.چون هم ساده است ، هم فضای کمتری از دیتابیس را اشغال می کند و هم سرعت خواندن و نوشتن داده ها در این روش زیاد است.
اما گاهی اوقات ، اگر نوع تاریخ به صورت DATETIME نباشد مسئله بسیار پیچیده می شود (مثلا اگر بخواهید افرادی را بیابید که امروز تولدشان است) در این صورت بهتر است از روش های 1 و 2 استفاده کنید.
امیدوارم به دردتون خورده باشه .موفقیت
سلام
توضیح خوب ، مفید و بسیار کارآمد و عالی
جای تشکر و قدردانی داره با تشکر
بسیار خوب – بین نظرات یک جدا کننده ی تصویری قرار بدید خواناتر میشه –
متشکرم بخاطر محتوا
سلام
من میخوام تاریخ رو با استفاده از date picker از کاربر بگیرم و در دیتابیس ذخیره کنم اما اول باید به میلادی تبدیلش کنم ولی نمیدونم چطوری
میشه کمکم کنید؟
سلام
اگر از ورودی تاریخ html5 استفاده کنید فکر نمی کنم نیازی باشه تبدیل کنید چون خودش میلادی هست . فقط در دیتابیس نوع فیلدی که قراره تاریخ توش ذخیره بشه رو date بزارید
فرض کنیم که اطلاعات با با روش استاندارد و بصورت یونیکس وارد دیتابیس کردیم اگه بخوام به بانک اطلاعاتی دستور بدیم که جداولی که تاریخشون بین
1/1/1391
و
5/3/1391
هست رو نشون بده باید چیکار کنیم
سلام راستش یه خرده گیج شدم من یه جدول تو پایگاه داده دارم برای قیمت لحظه ای اجناس حالا باید چطور از تاریخ استفاده کنم برای وارد کردن تاریخ بوسیله QUERYواستفاده از آن
سلام
استفاده از این روش ها دلخواه برنامه نویسه و باید با نگاه به آینده و کارهایی که مد نظر داره و راحتی خودش یکی رو انتخاب کنه
با عرض سلام و خسته نباشید لطفا این اسکریپت رو اگه خواستین و دیدین خوبه بزارین تو سایت
اسکریپت در سایت های زیر موجود است
http://mihanscript.ir/1748-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87-%DA%A9%D8%A7%D8%B1%D8%AA-%D8%B4%D8%A7%D8%B1%DA%98-%D8%A7%D9%85-%D9%BE%DB%8C-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1.html
———-
http://freescript.ir/%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%81%D8%B1%D9%88%D8%B4-%DA%A9%D8%A7%D8%B1%D8%AA-%D8%B4%D8%A7%D8%B1%DA%98-%D8%A7%D9%85-%D9%BE%DB%8C-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%DA%98/
———–
http://ashiyane.org/forums/showthread.php?p=315178
مرسی. عال بود. من با آخری موافقم. من همیشه از حالت آخری استفاده میکنم و توابع کار روی تاریخ رو میزارم به عهده php چون اغلب هم با تاریخ شمسی کار دارم مجبورم به صورت تاریخ شمسی ذخیره کنم در دیتابیس و مثل عدد و رشته معمولی باهاش برخورد کنم 🙂
سلام امیرجان
ممنون ، این راهیه دیگه ولی اگه به صورت استانداردتر ذخیره بشه بعدها دست آدم باز تره .می تونه از همون تاریخ میلادی استفاده کنه ، با اون تاریخ تعامل کنه یا به هر چیز دیگه ای مثل شمسی یا قمری تبدیلش کنه و … .
هر چی که می گذره بیشتر خوشحالم که به php رو نیاوردم اگه وقت شد کمی از هزاران تابعی که دات نت برای زمان ارائه کرده حتما می نویسم و یه کلاسی هم دارم که تاریخ شمسی رو به هر حالتی که بخواین تحویل می ده خیلی جالبه حتما می زارم دوستان لذتشو ببرن
سلام محمد جان
خوب خوشحال میشیم اگه کمی در مورد کار با تاریخ در net. توضیح بدین .با این حال کار کردن با تاریخ در php مشکل خاصی نداره و این رو سایت های بزرگی که باهاش نوشته شدن اثبات می کنه
سلام
خیلی عالی بود.
یه سوال:
نوع DateTime برای تاریخ شمسی مشکلی نداره؟ یعنی میتونیم برای تاریخ شمسی ازش استفاده کنیم؟
سلام حسین آقا
ممنون از لطفتون ،وقتی به رنج این نوع نگاه می کنیم (’۱۰۰۰-۰۱-۰۱′ به ’۹۹۹۹-۱۲-۳۱′) طبیعتا نباید مشکلی باشه