PDA

View Full Version : سوال: بهترین راه برای ذخیره زمان در دیتابیس چیه؟



idocsidocs
یک شنبه 28 خرداد 1391, 11:26 صبح
من الان زمان رو بر حسب تایم استمپ توی دیتابیس ذخیره می کنم ولی بعضی از اسکریپتها رو دیدم که به فرمت تاریخ ذخیره می کنن.

لطفا بگید کدوم روش مناسب تره؟

مسئله دیگه اینه که الان نوع ستونی که تایم استمپ رو توش نگه می دارم، int هست. از اونجا که نوع int تعداد محدودی رقم رو توی خودش نگه می داره، آیا ممکنه درآینده به مشکل بر بخورم؟

Yousha
یک شنبه 28 خرداد 1391, 11:37 صبح
timestamp بهترینه

idocsidocs
چهارشنبه 31 خرداد 1391, 01:28 صبح
برای این موضوع دلیلی دارید؟

Yousha
چهارشنبه 31 خرداد 1391, 11:16 صبح
Google کن مستندات رو ببین

Unique
چهارشنبه 31 خرداد 1391, 18:32 عصر
این موضوع بار ها مطرح شده !
به نظر شما اگه timestamp که یک نوع عددی هستش اگه کارایی های لازم را داشت ! چرا توی پایگاه های داده از نوع Datetime استفاده میشه ؟ چرا این همه تابع برای این نوع ساخته میشه ؟
این مستندات گوگل را من خیلی دلم میخواد ببینم !!!!! لطف کنید معتبر ترینش را معرفی کنین توی این پست.

نظر شخصی و تجربه شده بنده اینه که بهترین راه ذخیره تاریخ به فرمت میلادی در نوع داده ای DateTime هستش ! و هر کاری که بخوای هم میتونی باهاش بکنی ، تازه اگه بعدش هم بخوای timestamp بکنیش ! خود Mysql یک تابع برای این کار داره ! یا اصلا با خود تابع strtotime راحت timestamp میشه !

pejman_view
پنج شنبه 01 تیر 1391, 09:04 صبح
سلام

داشتم مطلب کاربر عزیز unique را می خواندم ، نمی دانم چرا بطور ناخود خواسته خندم گرفت. بنده خدا Yousha نظری دادند و شما کاملاً مورد هجومش قرار دارید. در جواب شما من توضیحات لازمه را خواهم داد! نه حرف شما غلط است و نه حرف Yousha، هرکدام مزیت هایی دارند که با توجه با کارتان انتخاب خواهید کرد که کدام را استفاده کنید. اول بگویم که نمی توانم حرف unique را برای اینکه چرا DateTime داریم و آن را نداریم تایید کنم... چون به همان دلیل هم من می گم اگر timestamp مهم نبود اصلاً مطرح نمی شد. حالا بگذارید توضیح بدهم شاید متوجه منظورم بشوید.
1- از مزیت های DateTime این است که شما به راحتی می توانید تاریخ و زمان را بدون هیچ نوع تبدیلی ببینید. اما در timestamp این گونه نیست باید حتما تبدیل را انجام دهید پس با نگاه به جدول دیتابیس به راحتی نمی توانید تشخیص بدهید تاریخش چه زمانی است.
2- از مزیت های DateTime این است که استارت آن سال 1000 تا 9999 است اما timestamp از سال 1970 به بعد است.
3- از مزیت timestamp بایت کمتری در حافظه ذخیره می کند تقریباً 4 بایت - اما DateTime در حدود تقریباً 8 بایت از حافظه اشغال می کند
4-از مزیت های timestamp دقیق بودنش است یعنی تفاوت زمانی در آن تاثیر ندارد همانطور که می دانید timestamp اینطوری نمایش داده می شود: 2012-06-06 09:14:00 اما بر اساس ساعت محلی کدوم کشوره؟ ایران ، آمریکا مربوط به چه موقع هست در DateTime این مورد را نخواهید یافت! اما در timestamp به راحتی می توان تشخیص داد 1340253990 یعنی 1340253990 ثانیه بعد از تاریخ 1970-01-01 00:00:00 UTC (گرینویچ) که اگر تبدیلش کنیم به ساعت ایران با توجه به اینکه الان ایران +4:30 ساعت جلوتر از گرینویچ پس 972000 + 1340253990 = می شود به وقت محلی ایران...

حالا به نظرت کدام یکی خوبه کدام بد!؟ من که به جواب نرسیدم... یا بهتر بگم باید کارم رو ببینم ، ببینم دقیقاً چه پیش نیازهایی دارم و از کدامش استفاده کنم. حالا من از کدامشون استفاده می کنم؟ من بیشتر از تایم استمپ بخاطر تاخر و تقدم زمانی که در گزینه 4 توضیحش دادم استفاده می کنم. اما در کل بسته به پروژه 70به 30 از تایم استمپ استفاده می کنم.

یه سوال پرسیدی تا یادم نرفته جواب بدم ... آیا به علت وجود محدودیت در int که 11 رقم می توانیم ذخیره کنیم در آینده به مشکلی بر خواهیم خورد؟ باید بگم نه! الان timestamp یک عدد 10 رقمی که با 1 شروع می شود این عدد 9هزار میلیارد ثانیه دیگر این عدد تازه 11 رقمی می شود فکر کنم حدود 10 هزار سال زمان ببره. کافیه دیگه نه؟

با آرزوی موفقیت.

Yousha
پنج شنبه 01 تیر 1391, 12:14 عصر
ای بابا:
http://forum.iranphp.org/Thread-%D9%81%DB%8C%D9%84%D8%AF-%D9%86%D9%88%D8%B9-Datetime-%D8%AF%D8%B1-%D9%85%D9%82%D8%A7%D8%A8%D9%84-%D9%86%D9%88%D8%B9-Timestamp?highlight=timestamp
بیا unique اینم مستند
پست خودمه


چرا توی پایگاه های داده از نوع Datetime استفاده میشه ؟
یعنی چی؟؟ کدوم پایگاه های داده؟؟

Unique
جمعه 02 تیر 1391, 01:09 صبح
بنده خدا Yousha نظری دادند و شما کاملاً مورد هجومش قرار دارید
من به کسی هجوم نبردم ! اصلا همچنین شخصیتی ندارم ! ایشون گفتن مستندات ! این کلمه اصلا برای جستجو در گوگل مناسب نیست ! چیزی مستندات هستش که توسط سایت رسمی php یا mysql یا pgsql یا msssql یا oracle ارائه بشه !


نمی توانم حرف unique را برای اینکه چرا DateTime داریم و آن را نداریم تایید کنم
شما نمیتوانید تایید کنید که نوع داده ای به نام timestamp وجود نداره ؟! من ندیدم و اگه هست بگین تا همه از جمله من استفاده کنیم.

باز هم میگم شخصا قصد زیر سوال بردن کسی یا موضوعی را نداشتم ، خود من برای Date اگه فارسی باشه و در حد نیاز پروژه Date را به صورت 13910401 ذخیره کرده ام (البته بیشتر در پروژه های Desktop) و مشکلی هم نداشتم ، به صورت timestamp هم ذخیره کردم ! به صورت میلادی هم ذخیره کردم !

نوع timestamp بزرگ ترین مشکلش اینه که برای بسیاری از پردازش ها باید محاسبات روش انجام داد و یکی از مشکلات اساسیش که اشاره شد اینه که از روی Database نمیشه تاریخ را دید و توی پروژه های بزرگ گاهی اوقات برای تحلیل مجبوری یکسری گزارش از روی خود پایگاه بگیری و وقتی timestamp بهت نشون میده کلی اذیت میشی !


نظر شخصی و تجربه شده بنده اینه که بهترین راه ذخیره تاریخ به فرمت میلادی در نوع داده ای DateTime هستش
این مسائل تجربیه و به تجربه فرد توی انجام پروژه ها بر میگرده ! نمیخوام تدافعی فکر کنم و فقط نظر شخصی دادم !

eshpilen
جمعه 02 تیر 1391, 09:22 صبح
یه سوال پرسیدی تا یادم نرفته جواب بدم ... آیا به علت وجود محدودیت در int که 11 رقم می توانیم ذخیره کنیم در آینده به مشکلی بر خواهیم خورد؟ باید بگم نه! الان timestamp یک عدد 10 رقمی که با 1 شروع می شود این عدد 9هزار میلیارد ثانیه دیگر این عدد تازه 11 رقمی می شود فکر کنم حدود 10 هزار سال زمان ببره. کافیه دیگه نه؟

چه جوری حساب کردی من نمیدونم!

در سال 2038 مقدار timestamp یونیکس دچار Overflow میشه.

اینو نگاه کن: http://en.wikipedia.org/wiki/Year_2038_problem

تازه بقول مقالهء ویکیپدیا، برنامه هایی که timestamp هایی مربوط به آینده رو ذخیره میکنن زودتر با این مشکل مواجه خواهند شد. مثلا برنامه ای که با زمانهایی مربوط به 20 سال بعد از زمان جاری کار میکنه در سال 2018 با مشکل مواجه میشه.

البته بعضی نرم افزارهایی که در سیستم عاملهای 64 بیتی اجرا میشن میتونن از این مشکل مستثنی باشن:




Most operating systems (http://en.wikipedia.org/wiki/Operating_system) designed to run on 64-bit (http://en.wikipedia.org/wiki/64-bit)hardware (http://en.wikipedia.org/wiki/Hardware_architecture) already use signed 64-bit time_t integers, effectively eliminating the Year 2038 problem in any software that has been developed to use the extended format.


ترجمه: «بیشتر سیستم عامل هایی که برای اجرا بر روی سخت افزار 64 بیتی طراحی شده اند از time_t با فضای ذخیره سازی 64 بیت استفاده میکنند که عملا مشکل سال 2038 را در هر نرم افزاری که برای استفاده از این فرمت توسعه یافته نوشته شده است برطرف میکند».

MMSHFE
جمعه 02 تیر 1391, 10:49 صبح
اینجا باز یک مزیت دیگه Open Source بودن PHP مشخص میشه. خودتون میتونید سورس کد تابع time رو تغییر بدین و به 64بیتی تغییر بدین. حتی طوری کار کنید که توی سیستمهای عامل 32بیتی هم بصورت 64بیتی کار کنه (الگوریتمهای کار با اعداد بزرگ). توی دیتابیس هم bigint بگذارین تا خیالتون از بابت 11 رقم راحت بشه. درسته که DateTime مزایای زیادی داره ولی TimeStamp هم بدون امتیاز نیست. سرعت در محاسبات و امکان تبدیل به Timezoneهای مختلف و افزایش/کاهش زمان به میزان دلخواه برحسب ثانیه و مقایسه راحتتر و... مزایای TS هستن. اگه به سورس کدها نگاه کنید، متوجه میشین که خود DateTime هم برای محاسبه، ابتدا TimeStamp رو محاسبه میکنه. البته لازمه یک نکته رو هم بگم: TimeStamp توی همه Timezoneهای ثابته و برخلاف اونچه که دوستمون اشاره کردن، نیازی به جمع زدن با هیچ عددی نداره. مثلاً:


date_default_timezone_set('UTC');
echo '<p>'.time().'</p>'.PHP_EOL;
echo '<p>'.date('Y/m/d H:i:s').'</p>'.PHP_EOL;
echo '<hr/>'.PHP_EOL;
date_default_timezone_set('Asia/Tehran');
echo '<p>'.time().'</p>'.PHP_EOL;
echo '<p>'.date('Y/m/d H:i:s').'</p>'.PHP_EOL;

توی خروجی کد فوق، هر دو تابع time عدد یکسانی چاپ میکنن ولی تابع date خروجی متفاوتی داره. این نشون میده که timestamp مستقل از منطقه زمانی هست که این خودش یک مزیته که باعث سهولت در کدنویسی میشه.
موفق باشید.

pejman_view
شنبه 03 تیر 1391, 16:42 عصر
با سلام

چه جوری حساب کردی من نمیدونم!

در سال 2038 مقدار timestamp یونیکس دچار Overflow میشه.
من یکم محاسباتم از نوع نگاه کردم
تقریباً حق با شماست اما من تا 1000 سال دیگه گارانتیش می کنم... اگر نرم افزارتون با پیشرفت های امروزی 30 سال دیگه هم کار کنه خیلی حرفه، همین الان راهش هست برای حل کردن این موضوع.


البته لازمه یک نکته رو هم بگم: TimeStamp توی همه Timezoneهای ثابته و برخلاف اونچه که دوستمون اشاره کردن، نیازی به جمع زدن با هیچ عددی نداره. مثلاً:


date_default_timezone_set('UTC');
echo '<p>'.time().'</p>'.PHP_EOL;
echo '<p>'.date('Y/m/d H:i:s').'</p>'.PHP_EOL;
echo '<hr/>'.PHP_EOL;
date_default_timezone_set('Asia/Tehran');
echo '<p>'.time().'</p>'.PHP_EOL;
echo '<p>'.date('Y/m/d H:i:s').'</p>'.PHP_EOL;

توی خروجی کد فوق، هر دو تابع time عدد یکسانی چاپ میکنن ولی تابع date خروجی متفاوتی داره. این نشون میده که timestamp مستقل از منطقه زمانی هست که این خودش یک مزیته که باعث سهولت در کدنویسی میشه.

بله حق با شماست اما دقت نکردید به حرفم اگر بخواهید تو PHP با ست کردن TimeZone اینکار را بکنید بله حق با شماست نیازی به محاسبه نداره چون خود TimeZone وظیفه اش محاسبه همین کاری بود بود که در توضیحاتم آوردم

با آرزوی موفقیت

ayub_coder
شنبه 03 تیر 1391, 17:10 عصر
:قهقهه: مطمئن باشید تا سال 2038 یه فکر به حالش می کنن!