Какая разница между типами DATE, TIME, DATETIME и TIMESTAMP

Мне нужно сохранить как время, так и date в mysql. Поэтому я использовал функцию NOW() для этого. Но я не знаю, что следует использовать для столбца типа im phpmyadmin. Следует отметить, что NOW() возвращает время и дату следующим образом:

2014-11-11 12:45:34

Вот решение, я могу использовать разделитель для разделения даты и времени (2014-11-11 и 12:45:34), а затем сохранить их в типе DATE и TIME отдельно. Или я могу использовать тип VARCHAR для хранения обоих из них в одном столбце. Но я думаю, что эти способы не являются стандартными. что является стандартным типом для хранения даты и времени?

Вот мой запрос: (также я не знаю, почему функция NOW() не работает)

INSERT INTO table (timedate) VALUES (NOW())

Ответ 1

ДАТА: используется для значений с частью даты, но без части времени. MySQL извлекает и отображает значения DATE в формате ГГГГ-ММ-ДД. Поддерживаемый диапазон: от 1000-01-01 до 9999-12-31.

DATETIME: используется для значений, которые содержат как дату, так и время. MySQL извлекает и отображает значения DATETIME в формате ГГГГ-ММ-ДД ЧЧ: ММ: СС. Поддерживаемый диапазон: 1000-01-01 00:00:00 до 9999-12-31 23:59:59.

TIMESTAMP: используется для значений, которые содержат как дату, так и время. TIMESTAMP имеет диапазон от 1970-01-01 00:00:01 UTC до 2038-01-19 03:14:07 UTC.

ВРЕМЯ: его значения представлены в формате ЧЧ: ММ: СС (или в формате ЧЧЧ: ММ: СС для больших значений часов). Значения ВРЕМЕНИ могут варьироваться от -838:59:59 до 838:59:59. Часть часов может быть настолько большой, потому что тип ВРЕМЯ может использоваться не только для представления времени суток (которое должно быть меньше 24 часов), но также истекшего времени или промежутка времени между двумя событиями (который может быть намного больше, чем 24 часа, или даже отрицательный).

Ответ 2

У меня немного другая точка зрения на разницу между DATETIME и TIMESTAMP. DATETIME хранит буквальное значение даты и времени без ссылки на какой-либо конкретный часовой пояс. Таким образом, я могу установить для столбца DATETIME значение, например "2019-01-16 12:15:00", чтобы точно указать, когда произошел мой последний день рождения. Было ли это восточное стандартное время? Стандартное тихоокеанское время? Кто знает? Когда текущий часовой пояс сервера вступает в игру, происходит, когда для столбца DATETIME установлено какое-либо значение, например NOW(). Сохраненное значение будет текущей датой и временем, используя текущий часовой пояс сеанса. Но после установки столбца DATETIME он будет отображаться одинаково независимо от текущего часового пояса.

Столбец TIMESTAMP, с другой стороны, принимает значение "2019-01-16 12:15:00", которое вы в него устанавливаете, и интерпретирует его в часовом поясе текущего сеанса для вычисления внутреннего представления относительно 1./1/1970 00:00:00 UTC. Когда столбец отображается, он будет преобразован обратно для отображения в зависимости от текущего часового пояса. Полезно думать, что TIMESTAMP принимает значение, которое вы устанавливаете, и конвертируете его из текущего часового пояса в UTC для хранения, а затем конвертируете обратно в текущий часовой пояс для отображения.

Если мой сервер находится в Сан-Франциско, но я запускаю мероприятие в Нью-Йорке, которое начинается 01.09.10 в 20:00, я бы использовал столбец TIMESTAMP для хранения времени начала, установите сеанс часовой пояс "Америка/Нью-Йорк" и установите время начала "2009-09-01 20:00:00". Если я хочу узнать, произошло событие или нет, независимо от текущей настройки часового пояса, я могу сравнить время начала с СЕЙЧАС(). Конечно, для значимого отображения перспективному клиенту мне нужно было бы установить правильный часовой пояс сеанса. Если бы мне не нужно было сравнивать время, то, вероятно, было бы лучше использовать столбец DATETIME, который будет отображаться правильно (с подразумеваемым часовым поясом EST) независимо от того, какой часовой пояс текущего сеанса ,

Ответ 3

Saty описаны различия между ними. Для вашей практики вы можете использовать datetime, чтобы сохранить вывод NOW().

Например:

CREATE TABLE Orders
(
  OrderId int NOT NULL,
  ProductName varchar(50) NOT NULL,
  OrderDate datetime NOT NULL DEFAULT NOW(),
  PRIMARY KEY (OrderId)
)

Вы можете прочитать больше на w3schools.