Я не уверен, как указать мой тип данных как дату или время, я думаю, что они понадобятся мне обоим, но для разных событий. Мой сайт продает продукты и услуги по всему миру, а также имеет систему учетных записей для входа в систему. Пожалуйста, уточните следующее:
- Текущая дата и время покупатель покупает товары с моего сайта: Datetime?
- Дата и время доставки на основе их местоположения и даты / времени покупки, рассчитанные по нашей системе: Datetime?
Последний раз они заходили в свою учетную запись: Timestamp?
- Какой код в php для хранения даты покупки (текущей даты) и последующего сохранения в базе данных?
- Пожалуйста, опишите, как использовать каждый из них, так как после прочтения большого количества объяснений в Интернете я все еще не совсем понял.
Ответы:
Временные метки 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 способ хранения дней рождения! Вы не можете сделать это с a
TIMESTAMP
, с единственным исключением, являющимся нулевым значением0000-00-00
.Вы можете хранить недействительные даты, если они вам нужны, в режиме ALLOW_INVALID_DATES .
В
NOW()
некоторых случаях вы можете установить значение по умолчанию , но предпочтительным и более естественным способом автоматически инициализируемых и обновляемых дат являетсяTIMESTAMP
.И, конечно, есть
DATE
и такиеTIME
, которые работают точно так же, какDATETIME
, но, конечноDATE
, не заботятся о времени иTIME
не заботятся о дате. Все четыре типа данных отлично работают с широким набором функций даты и времени , но когда вы смешиваете типы данных, вы должны знать о эффектах преобразования .Теперь к вашему вопросу: вы должны использовать
DATETIME
везде. Не по техническим причинам, но, поскольку вы все еще не знаете, как работает MySQL,DATETIME
это более простой выбор. Это будет означать, что вам нужно вычислить текущую временную метку в PHP перед сохранением, это так же просто, как:Функция даты в PHP работает так:
"Y-m-d H:i:s"
Формат является совместимым с MySQL и оставив второй параметр пустым,date()
требует ,time()
чтобы получить текущий UNIX метку времени .Использование
TIMESTAMP
вместо aDATETIME
имеет добавленную ценность MySQL, принимая на себя ответственность за выбор текущей метки времени, и вы можете пропустить поле при вставке / обновлении. Но так как вы уже отправляете запрос, а код для получения текущей временной метки в PHP минимален, вы можете смело идтиDATETIME
на все.Что касается фактического кода для хранения метки времени PHP в базе данных, вы должны посмотреть на объекты данных PHP , и если вам все еще неясно, спросите вместо этого StackOverflow . Но уже есть почти 1,5 тыс. Связанных вопросов , обязательно просмотрите их, прежде чем задавать вопросы. Просто подсказка, готовые заявления - вот как это делают крутые дети.
источник
Date
, это зарезервированное слово дляDATE
типа данных, и могут произойти странные вещи (в зависимости от версии MySQL), поэтому попробуйте переименовать его в нечто похожееcreationdate
и посмотреть, что произойдет , Кроме того, из PHP вы должны обращаться сTIMESTAMP
полями так же, как сDATETIME
полями, на самом деле это не имеет значения. Их формат одинаков.Ссылка взята из этой статьи:
Основные отличия:
TIMESTAMP используется для отслеживания изменений в записях и обновления каждый раз, когда запись изменяется. DATETIME используется для хранения определенного и статического значения, на которое не влияют какие-либо изменения в записях.
На TIMESTAMP также влияют различные настройки, связанные с TIME ZONE. DATETIME является постоянным.
TIMESTAMP внутренне преобразовал текущий часовой пояс в UTC для хранения, а во время поиска преобразовал обратно в текущий часовой пояс. DATETIME не может этого сделать.
Диапазон поддерживаемых TIMESTAMP: '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07' DTC DETETIME UTC Поддерживаемый диапазон: '1000-01-01 00:00:00' до '9999 -12-31 23:59:59 ′
источник
Я смотрю на это очень просто. В вашем случае я бы использовал и то
datetime
и другоеtimestamp
. При использовании обоих у вас не будет никаких дополнительных проблем с хранением данных или чем-то в этом роде. Одно дополнительное поле (столбец) в вашей таблице также не является большой проблемой.Так что, с моей точки зрения и опыта, я обычно использую оба. Если вы хотите показать дату своему посетителю или сделать ее понятной для посетителей, тогда отобразите дату в формате datetime.
Формат даты и времени может быть проблематичным, если вы хотите что-то посчитать (разница между двумя датами, получение вчерашней даты от текущей даты, получение 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
:), как это будет, если вы просто посмотрите на 11-значный номер. Так что используйте оба, а затем позвоните и используйте тот, который подходит вам лучше.Если вы должны или хотите выбрать только один, я бы предложил метку времени, в противном случае используйте оба.
источник
Timestamp is just a number 11 digit long which doesn't really "mean" anything
временные метки MySQL хранятся в том же формате, что и дата / время. Вам также необходимо преобразовать их в временные метки php, чтобы выполнить вычисления, которые вы описываете, ИЛИ просто использовать многие функции даты / времени MySQL и выполнять вычисления в базе данных. Ваш ответ на самом деле не имеет смысла.