PDA

View Full Version : بهترین نوع فرمت برای ذخیره سازی



iran_sanrio
چهارشنبه 10 آبان 1385, 08:43 صبح
بهترین نوع فرمت برای ذخیره سازی تاریخ و زمان در MySQL چطور هست.
با توجه به اینکه بعدا هر طور خواستیم روش مانوور بدیم ( منظورم اینه که بعدا واسه Sort و بیرون کشیدن و ... اطلاعات مشکلی نداشته باشیم و دستمون بسته نباشه )

PayamB
چهارشنبه 10 آبان 1385, 09:47 صبح
بهترین راه برای ذخیره تاریخ و زمان در Php استفاده از تابع time() برای گرفتن تاریخ فعلی و ذخیره اون تو دیتابیس هست.
خروجی این تابع تعداد ثانیه های گذشته از اول ژانویه 1970 هستش ( مثل 162538 ).

برای تبدیل این نوع تاریخ به صورت معمولی ( 1/1/1979 ) میتونیم از تابع date بصورت زیر استفاده کنیم.


$now = time();
$date = date("Y-m-d", $now);
echo $date;

iran_sanrio
چهارشنبه 10 آبان 1385, 19:11 عصر
شما کاملا متوجه منظور من نشدید.
من میخوام بدونم که فیلدی که در دیتابیس باید برای ذخیره زمان و تاریخ تعیین کنم از چه نوعی باید باشه.

armin390
چهارشنبه 10 آبان 1385, 21:50 عصر
http://www.mysql.org/doc/refman/5.1/en/date-and-time-type-overview.html

oxygenws
پنج شنبه 11 آبان 1385, 08:24 صبح
من شخصا عموما timestamp می ذارم. حداقلش اینه که کمترین فضا رو برای تاریخ و ساعت می گیره!

Helen_Farhani
جمعه 03 آذر 1385, 17:27 عصر
من شخصا عموما timestamp می ذارم. حداقلش اینه که کمترین فضا رو برای تاریخ و ساعت می گیره!


1- آیا با انتخاب این فرمت میشه قبل از بیرون کشیدن اطلاعات از دیتابیس، دیتا را Sort کرد؟
2- آیا میشه اطلاعات بین 2 تاریخ را قبل از بیرون کشیدن اطلاعات از دیتابیس، Select کرد؟

مرسی

oxygenws
جمعه 03 آذر 1385, 17:40 عصر
۱- بله
۲- بله

Helen_Farhani
جمعه 03 آذر 1385, 17:59 عصر
۱- بله
۲- بله
در مورد سوال 2 میشه با یک Query نشونم بدین؟

oxygenws
جمعه 03 آذر 1385, 20:48 عصر
سطر های دیروز تا امروز:


SELECT * FROM xyz WHERE date <= UNIX_TIMESTAMP(NOW()) AND date > UNIX_TIMESTAMP(NOW()) - 86400


اینو همین الان نوشتم، شاید مشکلات کوچیکی داشته باشه...

Helen_Farhani
شنبه 04 آذر 1385, 00:49 صبح
سطر های دیروز تا امروز:


SELECT * FROM xyz WHERE date <= UNIX_TIMESTAMP(NOW()) AND date > UNIX_TIMESTAMP(NOW()) - 86400


اینو همین الان نوشتم، شاید مشکلات کوچیکی داشته باشه...
دوست خوب، ممنون که توجه کردی. اما کمی برام مبهم هست. اگر برات امکانش هست در اطلاعات 5 روز پیش تا 10 روز آینده را Select کن. اینطوری کاملا دستم میاد که چه اتفاقی می افته.
مرسی

oxygenws
شنبه 04 آذر 1385, 08:35 صبح
قبلی یه اشکال کوچیک داشت که الان برطرف شد.


$ten_days = time() + 60 * 60 * 24 * 10;
$five_days = time() - (60 * 60 * 24 * 5);
SELECT * FROM xyz WHERE UNIX_TIMESTAMP(date) <= $ten_days AND UNIX_TIMESTAMP(date) > $five_days - 86400


اگر نمی دونی unix timestamp چیه، یه جستجویی تو اینترنت بکن.

Helen_Farhani
دوشنبه 06 آذر 1385, 22:54 عصر
قبلی یه اشکال کوچیک داشت که الان برطرف شد.


$ten_days = time() + 60 * 60 * 24 * 10;
$five_days = time() - (60 * 60 * 24 * 5);
SELECT * FROM xyz WHERE UNIX_TIMESTAMP(date) <= $ten_days AND UNIX_TIMESTAMP(date) > $five_days - 86400

اگر نمی دونی unix timestamp چیه، یه جستجویی تو اینترنت بکن.

در مورد timestamp جستجو کردم و کاملا متوجه شدم که چی هست. :لبخندساده:

:افسرده: متاسفانه قسمتی از مسئلمو نمیتونم حل کنم.

من روزانه مطالبی را درون یک دیتا بیس میریزم ( یک چیزی مثل وبلاگ )
میتونم هم مقادیر را Select کنم و بیرون بیارم و در چند صفحه هم نمایش بدم.
اما مشکل اینجا هست که نمیتونم اطلاعاتم را جداگانه Select کنم و مثلا 5 روز آخر را جدا از هم لیست کنم. به اینطورت که مثلا امروز 5 تا ازسال بوده حالا بیاد 5 تا ارسال را لیست کنه. روزگذشته 8 تا بوده این 8 تا را جدا اما در زیر دسته بندی روز قبل لیست کنم.
با تاریخها سرو کله زدم نشد.
با Subquery ها تا حدودی سرو کله زده اما بازم نشد.
خسته شدم

oxygenws
سه شنبه 07 آذر 1385, 09:25 صبح
من مفهوم این مشکل دومت رو نفهمیدم...

Helen_Farhani
سه شنبه 07 آذر 1385, 09:54 صبح
من مفهوم این مشکل دومت رو نفهمیدم...

فرض کنیم ما اطلاعات 50 روز را در دیتابیس داریم. بعضی از این اطلاعات تاریخ یکسانی دارند ( یعنی در یک روز چند رکورد ثبت شده )


حالا من میخوام اطلاعات 5 روز آخری که دیتا ثبت ده را از دیتابیس بیرون بکشم.

دقیقا یک چیزی مثل وبلاگ.
5 روز آخر را زیر هم نمایش میدیم. حالا ممکنه که در یک روز چند بار پست فرستاده باشیم.
متوجه شدین؟

oxygenws
سه شنبه 07 آذر 1385, 14:58 عصر
همون کوئری ای که من در بالا نوشتم جواب میده دیگه!! مشکل اون چیه؟؟

Helen_Farhani
سه شنبه 07 آذر 1385, 21:58 عصر
همون کوئری ای که من در بالا نوشتم جواب میده دیگه!! مشکل اون چیه؟؟

من خروجی را براتون بفرستم تا بلکه از این راه بتونم منظورمو برسونم. خوبه اینطور؟

Helen_Farhani
سه شنبه 07 آذر 1385, 22:38 عصر
به این توجه داشته باشید که روزها پشت سر هم نیستند. ممکنه بین نوشتن مطالب توی دیتابیس چند روز یا چند هفته وقفه به وجود بیاد.


http://img.majidonline.com/pic/51640/query.gif

oxygenws
چهارشنبه 08 آذر 1385, 00:44 صبح
تنها چیزی که الان به ذهن من می رسه، استفاده از دو تا کوئری است...


select count(*) from table_name where 1=1 group by date order by date desc


بعد ۵ تا عدد برگشتی از ابتدا رو با هم جمع کنی (برای ۵ روز) و بریزی تو متغیری مثل $x و بفرستی توی این کوئری....


select * from table_name
where 1=1 order by date desc limit $x



این کد قطعا جواب میده (با رفع باگ های احتمالی) اما احتمالا بهترین راه نیست!! باز هم جستجو بکن...

Helen_Farhani
چهارشنبه 08 آذر 1385, 08:25 صبح
تنها چیزی که الان به ذهن من می رسه، استفاده از دو تا کوئری است...


select count(*) from table_name where 1=1 group by date order by date desc

بعد ۵ تا عدد برگشتی از ابتدا رو با هم جمع کنی (برای ۵ روز) و بریزی تو متغیری مثل $x و بفرستی توی این کوئری....


select * from table_name
where 1=1 order by date desc limit $x

:قهقهه:
این کد قطعا جواب میده (با رفع باگ های احتمالی) اما احتمالا بهترین راه نیست!! باز هم جستجو بکن...


آقا مدیر میترسم که بگم، نفهمیدم که چی شد!

where 1=1
این از کجا اومده
:افسرده:

oxygenws
چهارشنبه 08 آذر 1385, 08:39 صبح
خط اول تعداد پست های هر *روز* رو می شماره (به فرض اینکه date فقط تاریخ رو شامل میشه و ساعت نداره)
اون where هم که نوشتم فقط برای اینه که جای where رو رزرو کرده باشم، به هر حال شما هیچ where ای ندارید؟؟

با PHP تعداد تمام پست های 5 روز آخر رو می شماری... (این کارو میشه با stored procedure هم انجام داد)

و خط بعدی به اون تعدادی که شمردی، limit می کنی و اون تعداد پست اخر رو می خونی.

oxygenws
یک شنبه 12 آذر 1385, 10:36 صبح
این رو تست کن، این از قبلی خیلی بهتره، تو یک پرس و جو....



SELECT * FROM table_name
WHERE date IN(
SELECT date FROM table_name
WHERE 1=1
ORDER BY date DESC
GROUP BY date
LIMIT 5
)