В чем разница между временем PHP и временем SQL? - PullRequest
2 голосов
/ 16 мая 2010

Почему метка времени, сгенерированная функцией PHP time(), так отличается от даты и времени в SQL?

Если я сделаю date('Y-m-d', time()); в PHP, это даст мне время, как и должно быть. Если я просто возьму time() часть и сделаю:

$now = time();
//then execute this statement 'SELECT * FROM `reservation` WHERE created_at < $now'

Я ничего не понимаю. Но, эй, так что если значение $now было 1273959833, и я запросил

  'SELECT * FROM `reservation` WHERE created_at < 127395983300000000'

тогда я вижу записи, которые я создал. Я думаю, что один отслеживается в микросекундах против другого в секундах, но я не могу найти документацию по этому вопросу! Что было бы правильным преобразованием между этими двумя?

Ответы [ 3 ]

7 голосов
/ 16 мая 2010

Функция time() не возвращает микросекунды, поэтому она должна работать, если вы используете правильный тип данных. Но сейчас у вас есть 2 разных типа данных, INT и поле даты (может быть DATE / DATETIME / TIMESTAMP). Если вы хотите сравнить дату в базе данных с отметкой времени как целое число, вы можете использовать что-то вроде:

SELECT * FROM Tbl WHERE UNIX_TIMESTAMP(date) < $timestamp;
2 голосов
/ 16 мая 2010

time() дает метку времени Unix (секунды, прошедшие с 01-01-1970) - SQL хочет иметь метки времени в формате YYYY-mm-dd hh-ii-ss, что делается date () - так что если вы не хотите вызывать 2 PHP функции, просто используйте $now = date("Y-m-d H:i:s") или, что еще лучше, измените SQL-запрос на created_at < NOW().

1 голос
/ 16 мая 2010

Это всего лишь 2 разных способа хранения дат, каждый со своими преимуществами и недостатками. Вы можете использовать поле даты MySQL или просто хранить метки времени Unix в поле INT. Вы также можете использовать:

ВЫБРАТЬ UNIX_TIMESTAMP (имя_поля) ОТ ...

чтобы вернуть поле даты в качестве метки времени Unix.

Поле даты MySQL доступно для чтения человеком и может хранить любую дату в обозримом будущем. Тем не менее, он не хранит информацию о часовом поясе, которая может вызвать серьезные проблемы, если обрабатывается неправильно. У Facebook была эта проблема некоторое время назад.

В метках времени Unix хранится информация о часовом поясе (поскольку она определяется как количество секунд с 12:00 утра 1 января 1970 года по UTC). Операции сравнения с целыми числами выполняются быстрее, а функции времени и даты в PHP предназначены для использования с метками времени Unix. Однако Linux может поддерживать только даты с 1902 по 2038 год, а в Windows - с 1970 по 2038 год. MySQL и архитектура в целом переключатся на 64-разрядные целые числа задолго до наступления 2038 года, но если вам нужно сохранить даты, которые находятся в далеком будущем Прошлое время Unix не для тебя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...