Datetime vs Timestamp в MySQL та PHP на практиці?


24

Я не впевнений, як вказати свій тип даних як дату або часову позначку, я думаю, що вони мені знадобляться, але для різних подій. Мій веб-сайт продає товари та послуги по всьому світу, а також має систему облікових записів для входу користувачів. Будь ласка, уточніть наступне:

  • Поточна дата та час, коли клієнт купує товари з мого веб-сайту: Datetime?
  • Дата та час доставки залежно від їх місцезнаходження та придбаної дати / часу, обчислені в нашій системі: Datetime?
  • Востаннє вони входили у свій обліковий запис: Timestamp?

    1. Який код у php зберігає дату придбання (поточну дату) та зберігає в базі даних?
    2. Розкажіть, будь ласка, як користуватися кожним з них, оскільки прочитавши багато пояснень в Інтернеті, я все ще не дуже розумію.

Нещодавно у мене був великий проект, в якому продуктивність була абсолютно необхідною, після місяців досліджень ми закінчилися тимчасовою
позначкою

Відповіді:


29

Часові мітки MySQL :

  • Зберігаються в UTC

    Вони конвертуються в UTC на сховищі та повертаються назад у ваш часовий пояс. Якщо ви змінюєте налаштування часового поясу , отримані значення також змінюються.

  • Можна автоматично ініціалізувати та оновлювати

    Ви можете встановити їх значення за замовчуванням та / або значення автоматичного оновлення на CURRENT_TIMESTAMP

  • Мають діапазон 1970-01-01 00:00:01 UTCдо2038-01-19 03:14:07 UTC

Тоді як дата MySQL :

  • Що ви зберігаєте - це те, що ви отримуєте ™.

  • Мають діапазон 1000-01-01 00:00:00до9999-12-31 23:59:59

    Значення поза діапазоном можуть працювати, але гарантуються лише ті значення, що знаходяться в межах діапазону .

  • Ви можете зберігати дати, де день або місяць дорівнює нулю.

    Це спосіб зберігання днів народження MySQL! Ви не можете зробити це з а TIMESTAMP, єдиним винятком є ​​нульове значення 0000-00-00.

  • Ви можете зберігати недійсні дати, якщо вони вам потрібні, в режимі ALLOW_INVALID_DATES .

  • Ви можете встановити значення за замовчуванням NOW()у деяких випадках, але кращим і більш природним способом автоматичної ініціалізації та оновлення дат є TIMESTAMP.

І звичайно, є DATEі такі TIME, які працюють так само DATETIME, але, звичайно DATE, не піклується про час і TIMEне хвилює побачення. Усі чотири типи даних чудово працюють із широким набором функцій дати та часу , але коли ви змішуєте типи даних, ви повинні знати про ефекти перетворення .

Тепер, до вашого питання: Ви повинні користуватися DATETIMEскрізь. Не з технічних причин, але оскільки вам все ще незрозуміло, як працює MySQL, DATETIMEце простіший вибір. Це означатиме, що вам доведеться обчислити поточну часову позначку в PHP перед зберіганням, це так просто, як:

$mysqldate = date("Y-m-d H:i:s"); 

Функція дати PHP працює так:

string date ( string $format [, int $timestamp = time() ] )

"Y-m-d H:i:s"Формат є сумісним з MySQL і залишивши другий параметр порожнім, date()вимагає , time()щоб отримати поточний UNIX мітку часу .

Використання TIMESTAMPзамість а DATETIMEмає додаткове значення MySQL, приймаючи на себе відповідальність за прийняття рішення про поточну мітку часу, і ви можете пропустити поле під час вставки / оновлення. Але оскільки ви вже надсилаєте запит, і код для отримання поточної мітки часу в PHP мінімальний, ви можете сміливо працювати з DATETIMEусім.

Що стосується фактичного коду для зберігання часової позначки PHP в базі даних, ви повинні подивитися на об'єкти даних PHP , і якщо вам все ще незрозуміло, запитайте замість StackOverflow . Але вже є майже 1,5 тис. Пов'язаних питань , переконайтесь, що ви їх перегляньте, перш ніж задавати питання. Лише підказка, підготовлені заяви - це як круті діти це роблять.


Хм, це може бути проблемою щодо того, як ви надсилаєте запит до MySQL або в структурі вашої таблиці ... StackOverflow є кращим місцем для подібних проблем, опублікуйте там питання зі своєю структурою таблиці та повним кодом php та деякі деталі щодо проблеми і що ви вже спробували. Тут ми не дуже обговорюємо особливості впровадження ...
yannis

Дякуємо за Ваш відповідь. Я спробував використовувати $ mysqldate = date ("Ymd H: i: s"); $ query = INSERT INTO table VALUE ('". $ mysqldate."') на моєму PHP-коді, але він зберігатиметься в MySQL як 0000-00-00 00:00:00 у Date (поле) - Datetime (type data). Я маю намір зберігати поточну дату та час. Якщо я встановив тип даних як Timestamp в базі даних, як кодувати в php?
Модульний

На даний момент мені не дозволяють публікувати жодних коментарів щодо Stackoverflow. Звучить трохи соромно, але саме так вони зробили мені.
Модульний

Вибачте за це, але якщо ви перебуваєте в режимі тимчасової зупинки, то це має бути вагома причина. Тепер одна можлива помилка в коді у вашому коментарі про те, що ви називаєте поле як Date, це зарезервоване слово для DATEтипу даних і можуть статися дивні речі (залежно від версії MySQL), тому спробуйте перейменувати його на щось на зразок creationdateі подивіться, що відбувається . Крім того, з PHP ви повинні обробляти TIMESTAMPполя так само, як і DATETIMEполя, це не має значення. Формат їх однаковий.
янніс

Завдяки мільйонів. Це було відсортовано зараз, витративши майже всю ніч, намагаючись зрозуміти, чому. :)
Модульний

2

Довідка, взята з цієї статті:

Основні відмінності:

TIMESTAMP використовується для відстеження змін у записах та оновлення кожного разу, коли запис змінюється. DATETIME використовується для зберігання конкретного та статичного значення, на яке ніякі зміни в записах не впливають.

TIMESTAMP також впливає на різні налаштування, пов'язані з TIME ZONE. DATETIME є постійним.

TIMESTAMP внутрішньо перетворив поточний часовий пояс у UTC для зберігання, а під час пошуку перетворив назад у поточний часовий пояс. DATETIME не може цього зробити.

TIMESTAMP підтримується діапазон: '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07' UTC DATETIME підтримується діапазон: '1000-01-01 00:00:00' до '9999 -12-31 23:59:59 ′


1
Тож у 2040 році що б ви використали для зміни записів, Timestamp? Я думаю, що не.
Bsienn

-1

Ну, я дивлюся на це дуже просто. У вашому випадку я б використовував і те, datetimeі timestamp. При використанні обох у вас не виникне додаткових проблем зі зберіганням даних або щось подібне. Одне додаткове поле (стовпець) у вашій таблиці також не є великою проблемою.

Тому в моїй точці зору та досвіді, як правило, я використовую обидва. Коли ви хочете показати побачення відвідувачеві або зробити його зрозумілим для відвідувачів, тоді покажіть дату у форматі дати.

Формат дати може бути болем, коли ви хочете щось обчислити (різниця між двома датами, отримати вчорашню дату від поточної дати, отримати 1 тиждень тому від поточної дати, отримати завтрашню дату чи щось подібне.) Це не дуже важко, але зазвичай потрібно їх перетворити, timestampа потім виконати. І так, наприклад, поточний час, наприклад, який ви отримуєте: $current = date("Y-m-d");або $current = date("Y-m-d H:i:s");якщо ви також хочете години, хвилини та секунди.

Тайм-метс - це лише цифра 11 цифр, яка насправді нічого не означає. Якщо ви подивитесь на нього, ви не будете знати, яку дату він представляє. Отже, це не дуже зручно для користувачів, і ви не можете використовувати його, щоб просто повторити його і показати, наприклад, своїм відвідувачам. Вам потрібно буде "перетворити" його на щось читабельне. Але це також пропонує вам можливість легко перетворити його та обчислити різні дати. Наприклад, якщо ви хочете отримати позначку часу на завтра одночасно, ви просто додасте кількість секунд до поточної дати, і у вас є позначка часу на завтра. Приклад: $tomorrow = time()+24*3600;Ви також можете легко отримати різницю між двома датами в секундах або будь-що подібне.

Тому я б запропонував використовувати як дату, так і часову позначку. Навіть якщо ви використовуєте, наприклад, PhpMyadmin і хочете швидко переглянути деякі дані, вам стане легше, коли ви побачите дату у форматі дати (наприклад 2011-12-20 10:15:20:), як це буде, якщо ви просто подивитеся на номер 11digit. Тому використовуйте обидва, а потім телефонуйте та використовуйте той, який вам більше підходить.

Якщо ви хочете вибрати або хочете вибрати лише одну, я б запропонував, щоб інакше було використано обидва.


1
-1 Timestamp is just a number 11 digit long which doesn't really "mean" anythingЧасові мітки MySQL зберігаються в тому ж форматі, що і дата. Вам також потрібно перетворити їх у часові позначки php, щоб зробити описані вами розрахунки, АБО просто використовувати багато функцій дати / часу MySQL та робити обчислення в базі даних. Ваша відповідь насправді не має сенсу.
янніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.