php преобразование даты для mysql
PHP date() format when inserting into datetime in MySQL
What is the correct format to pass to the date() function in PHP if I want to insert the result into a MySQL datetime type column?
I’ve been trying date(‘Y-M-D G:i:s’) but that just inserts «0000-00-00 00:00:00» everytime.
13 Answers 13
Try: date(‘Y-m-d H:i:s’) which uses the numeric equivalents.
From the comments of php’s date() manual page:
Here’s an alternative solution: if you have the date in PHP as a timestamp, bypass handling it with PHP and let the DB take care of transforming it by using the FROM_UNIXTIME function.
I use the following PHP code to create a variable that I insert into a MySQL DATETIME column.
This will hold the server’s current Date and Time.
I use this function (PHP 7)
Older versions of PHP (PHP
Format time stamp to MySQL DATETIME column :
Format MySQL datetime with PHP
There is no need no use the date() method from PHP if you don’t use a timestamp. If dateposted is a datetime column, you can insert the current date like this:
This has been driving me mad looking for a simple answer. Finally I made this function that seems to catch all input and give a good SQL string that is correct or at least valid and checkable. If it’s 1999-12-31 it’s probably wrong but won’t throw a bad error in MySQL.
Note: I understood the question referring to current time.
Преобразование даты в mysql с помощью DATE_FORMAT()
Как известно, все даты хранятся в mysql в обратном порядке год-месяц-число(2008-10-18), иногда даже без разделителя(20081018).
Чтобы вывести дату, нужно ее преобразовать в нормальный читаемый вид.
Тут есть два способа преобразования, эффективный и не очень.
Не эффктивный способ это когда дату выводимую из mysql преобразуют с помощью php.
Сам лично так делал очень долгое время. Перед выводом на экран переворачивал каждую дату с помощью php функции.
Если количество преобразований не большое, то можно переворачивать дату и с помощью php, ничего плохого тут нет, но если нужно будет выдернуть десятки-сотни тысяч записей и в каждой преобразовать дату, то тут конечно намного быстрее будет преобразование дат с помощью mysql.
В mysql существует отличная функция DATE_FORMAT(), она очень похожа на php функцию date().
Вот пример использования
SELECT DATE_FORMAT(«2008-11-19»,’%d.%m.%Y’);
результат
Все очень просто и быстро, нет необходимости крутить даты с помощью php.
Вот список определителей этой функции
Определитель | Описание |
%M | Название месяца (январь. декабрь) |
%W | Название дня недели (воскресенье. суббота) |
%D | День месяца с английским суффиксом (0st, 1st, 2nd, 3rd и т.д.) |
%Y | Год, число, 4 разряда |
%y | Год, число, 2 разряда |
%X | Год для недели, где воскресенье считается первым днем недели, число, 4 разряда, используется с ‘%V’ |
%x | Год для недели, где воскресенье считается первым днем недели, число, 4 разряда, используется с ‘%v’ |
%a | Сокращенное наименование дня недели (Вс. Сб) |
%d | День месяца, число (00..31) |
%e | День месяца, число (0..31) |
%m | Месяц, число (00..12) |
%c | Месяц, число (0..12) |
%b | Сокращенное наименование месяца (Янв. Дек) |
%j | День года (001..366) |
%H | Час (00..23) |
%k | Час (0..23) |
%h | Час (01..12) |
%I | Час (01..12) |
%l | Час (1..12) |
%i | Минуты, число (00..59) |
%r | Время, 12-часовой формат (hh:mm:ss [AP]M) |
%T | Время, 24-часовой формат (hh:mm:ss) |
%S | Секунды (00..59) |
%s | Секунды (00..59) |
%p | AM или PM |
%w | День недели (0=воскресенье..6=суббота) |
%U | Неделя (00..53), где воскресенье считается первым днем недели |
%u | Неделя (00..53), где понедельник считается первым днем недели |
%V | Неделя (01..53), где воскресенье считается первым днем недели. Используется с `%X’ |
%v | Неделя (01..53), где понедельник считается первым днем недели. Используется с `%x’ |
%% | Литерал `%’. |
Комментарии
28.11.2008 Жека
Аналогично! Всегда пользовался своей функцией на php
03.12.2008 Сергей
Ну а вообще, кто то хоть пользуется таким подходом?
Или все используют php для переворота даты?
Я лично никогда не переворачивал дату в mysql, до сих пор все в php делаю
28.06.2009 Илья
К сожалению, ничего не получилось 🙁
08.07.2009 Виталий
Круто, спасибо за функцию. Интересно, а ёщё какие нибуть загогулины есть?
14.07.2009 DSaint
Спасибо, очень помогло. Осталось только название месяца на русском отобразить)
28.07.2009 Влад
mysql=>PHP
select unix_timestamp(start_date) as start_date_php
php-code
date(‘d.m.Y’,$row[‘start_date_php’])
PHP=>MySQL
update table set start_date=DATE_FORMAT(STR_TO_DATE(‘19.12.2009 18:35:22′,’%d.%m.%Y %H:%i’),’%Y.%m.%d %H:%i’)
18.08.2009 Гость
2: DSaint
Есть такая чудная функция:
ELT( MONTH(‘2004-04-10’), ‘Янв.’,’Фев.’,’Март’,’Апр.’,’Май’,’Июнь’,’Июль’,’Авг.’,’Сен.’,’Окт.’,’Ноя.’,’Дек.’)
29.10.2009 Владимир
Спасибо, про ELT( MONTH(‘2004-04-10’), ‘Янв.’,’Фев.’,’Март’,’Апр.’,’Май’,’Июнь’,’Июль’,’Авг.’,’Сен.’,’Окт.’,’Ноя.’,’Дек.’)
я не слыхал.
07.10.2010 Евгений
А что быстрее работает? Преобразование в запросе, или в результате работы php-функции?
07.10.2010 defender
Как минимум меньше памяти на обработку меньше вызовов функций меньше выделений памяти. Постоянно подобным пользуюсь только не в mysql а в postgresql.
08.10.2010 Админ
Евгений, вот defender правильно сказал, через базу это преобразование должно сработать красивее, но конечно если речь идет об извлечении огромного количества данных.
Если вы дергаете 10-20 записей, то нет никакой разницы как преобразовать дату, по сравнению с остальными нагрузками это мелочь.
27.01.2011 pcemma
ухх спасибо аффтору (: отпала нужда юзать свою мега крутую функцию для преобразования (:
13.04.2011 Xes
кАК ЕЕ ПОЛЬЗОВАТЬ В ПХП
while ($sqlr=mysql_fetch_array($sql))
<
echo ($sqlr[‘comadd’].’ ‘.$sqlr[‘comment’].’
14.04.2011 Виталий
У меня в базе дата записана в формате 19.11.2008 тип таблицы VARCHAR, как ее перезаписать в базу в формате 2008-11-19?
Руками просто очень долго.
Спасибо.
15.04.2011 админ
Xes, это функция MySQL, использовать ее нужно в запросе sql, который судя по вашему коду находится где-то выше. В данном участке кода ее нельзя использовать.
15.04.2011 админ
Виталий, просто измените тип ячейки на DATE, mysql автоматически переведет все данные в этой ячейке именно в формат 2008-11-19.
Но на всякий случай перед изменением типа ячейки сделайте дамп этой таблицы, так как вдруг база что то не то сделает и таблица сломается вообще.
Если вам важно оставить тип поля varchar, то после того, как вы установите тип DATE, установите обратно varchar.
Это самый простой вариант, но не совсем правильный, но я проверил, он работает.
24.05.2011 Константин
а я всегда беру SELECT *,UNIX_TIMESTAMP(created) AS created FROM.
а мотом могу хоть в каком формате. Хоть только день, хоть только время.
и сравнивать, что больше 14.05.2011 или 14.05.2010.
А записываю так:
. date=’.gmdate(«Y-m-d H:i:s»,$created).
и вобщем-то, не вижу причин менять привычки
24.05.2011 сергей
Константин, да я и сам использую для вывода php date(), просто тут рассмотрен вариант преобразования даты не через php, а через mysql.
Я бы сказал, что это просто обзор mysql функции и она конечно имеет право на существование.
Изучаем MySQL: работа с датами и временем
В этой статье мы рассмотрим основы работы с датой и временем в MySQL.
Формат даты и времени
MySQL date format поддерживает несколько форматов даты и времени. Их можно определить следующим образом:
DATE — хранит значение даты в виде ГГГГ-ММ-ДД. Например, 2008-10-23.
DATETIME — хранит значение даты и времени в виде ГГГГ-MM-ДД ЧЧ:ММ:СС. Например, 2008-10-23 10:37:22. Поддерживаемый диапазон дат и времени: 1000-01-01 00:00:00 до 9999-12-31 23:59:59
TIMESTAMP — похож на DATETIME с некоторыми различиями в зависимости от версии MySQL и режима, в котором работает сервер.
Создание полей даты и времени
Форматы даты и времени
Наиболее часто используемым разделителем для дат является тире ( — ), а для времени — двоеточие ( : ). Но мы можем использовать любой символ, или вообще не добавлять никакого символа.
Например, все следующие форматы являются правильными:
Функции даты и времени
MySQL содержит множество функций, которые используются для обработки даты и времени. В приведенной ниже таблице представлен список наиболее часто используемых функций:
Функция | Описание |
ADDDATE() | Добавляет дату. |
ADDTIME() | Добавляет время. |
CONVERT_TZ() | Конвертирует из одного часового пояса в другой. |
CURDATE() | Возвращает текущую дату. |
CURTIME() | Возвращает текущее системное время. |
DATE_ADD() | Добавляет одну дату к другой. |
MySQL DATE FORMAT () | Задает указанный формат даты. |
DATE() | Извлекает часть даты из даты или выражения дата-время. |
DATEDIFF() | Вычитает одну дату из другой. |
DAYNAME() | Возвращает день недели. |
DAYOFMONTH() | Возвращает день месяца (1-31). |
DAYOFWEEK() | Возвращает индекс дня недели из аргумента. |
DAYOFYEAR() | Возвращает день года (1-366). |
EXTRACT | Извлекает часть даты. |
FROM_DAYS() | Преобразует номер дня в дату. |
FROM_UNIXTIME() | Задает формат даты в формате UNIX. |
MySQL DATE_SUB () | Вычитает одну дату из другой. |
HOUR() | Извлекает час. |
LAST_DAY | Возвращает последний день месяца для аргумента. |
MAKEDATE() | Создает дату из года и дня года. |
MAKETIME () | Возвращает значение времени. |
MICROSECOND() | Возвращает миллисекунды из аргумента. |
MINUTE() | Возвращает минуты из аргумента. |
MONTH() | Возвращает месяц из переданной даты. |
MONTHNAME() | Возвращает название месяца. |
NOW() | Возвращает текущую дату и время. |
PERIOD_ADD() | Добавляет интервал к месяцу-году. |
PERIOD_DIFF() | Возвращает количество месяцев между двумя периодами. |
QUARTER() | Возвращает четверть часа из переданной даты в качестве аргумента. |
SEC_TO_TIME() | Конвертирует секунды в формат ‘ЧЧ:MM:СС’. |
SECOND() | Возвращает секунду (0-59). |
MySQL STR TO DATE () | Преобразует строку в дату. |
SUBTIME() | Вычитает время. |
SYSDATE() | Возвращает время, в которое была выполнена функция. |
TIME_FORMAT() | Задает формат времени. |
TIME_TO_SEC() | Возвращает аргумент, преобразованный в секунды. |
TIME() | Выбирает часть времени из выражения, передаваемого в качестве аргумента. |
TIMEDIFF() | Вычитает время. |
TIMESTAMP() | С одним аргументом эта функция возвращает дату или выражение дата-время. С двумя аргументами возвращается сумма аргументов. |
TIMESTAMPADD() | Добавляет интервал к дате-времени. |
TIMESTAMPDIFF() | Вычитает интервал из даты — времени. |
TO_DAYS() | Возвращает аргумент даты, преобразованный в дни. |
UNIX_TIMESTAMP() | Извлекает дату-время в формате UNIX в формат, принимаемый MySQL. |
UTC_DATE() | Возвращает текущую дату по универсальному времени (UTC). |
UTC_TIME() | Возвращает текущее время по универсальному времени (UTC). |
UTC_TIMESTAMP() | Возвращает текущую дату-время по универсальному времени (UTC). |
WEEK() | Возвращает номер недели. |
WEEKDAY() | Возвращает индекс дня недели. |
WEEKOFYEAR() | Возвращает календарную неделю даты (1-53). |
YEAR() | Возвращает год. |
YEARWEEK() | Возвращает год и неделю. |
Вы можете попробовать сочетание нескольких функций в одном запросе (например, чтобы найти день недели):
Внесение значений даты и времени в столбцы таблицы
Данный запрос создает заказ для указанного элемента с датой, временем выполнения заказа, и интервалом через две недели после этого в качестве даты доставки:
Точно так же можно заказать товар с датой доставки через два месяца:
Извлечение данных по дате и времени
В MySQL мы можем отфильтровать извлеченные данные в зависимости от даты и времени. Например, мы можем извлечь только те заказы, доставка которых запланирована на ноябрь:
Заключение
преобразовать дату php в формат mysql
У меня есть поле даты в php, которое использует этот код:
Как преобразовать это в формат MySql 0000-00-00 для включения в db. Является ли это по строкам: date (‘Ymd’ strtotime ($ date). Причина, о которой я прошу, заключается в том, что я пробовал варианты этого, и я не могу заставить его работать. Либо отображается как 1970, либо какой-то другой вариант из этого. Большое спасибо
1. Если в столбце MySQL DATE тип DATE :
2. Если ваш столбец MySQL имеет тип DATETIME :
На этом сайте есть два довольно простых решения – просто проверьте код, я предоставил описания на случай, если вы захотите, – сэкономит вам несколько кликов.
1. Одно общее решение – хранить даты в полях DATETIME и использовать функции PHP (Date) и strtotime () для преобразования между метками времени PHP и MySQL DATETIME. Методы будут использоваться следующим образом:
Второй второй вариант – позволить MySQL выполнять работу. У MySQL есть функции, которые мы можем использовать для преобразования данных в тот момент, когда мы обращаемся к базе данных. UNIX_TIMESTAMP будет конвертировать из DATETIME в временную метку PHP, а FROM_UNIXTIME будет конвертировать из временной метки PHP в DATETIME. Методы используются в SQL-запросе. Поэтому мы вставляем и обновляем даты с помощью таких запросов,
Используйте их в своем SQL, например:
Если consum_date – это общий формат даты, вы можете использовать date() и strtotime()
Если у вас есть дата в формате dd / mm / yyyy, используйте следующую команду:
Если у вас это в мм / дд / гггг, просто измените вторую строку:
Существует несколько вариантов.
Либо преобразуйте его в timestamp и используйте, как указано в других сообщениях с помощью strtotime() или используйте параметр синтаксиса даты MySQL
хотя если у вас есть действительная дата даты (‘ym-d’, strtotime ($ date)); должен также работать
PHP 5.3 имеет функции для создания и переформатирования объекта DateTime из любого формата, который вы указываете:
MySQL также может управлять форматированием с помощью функции STR_TO_DATE() при вставке / обновлении и DATE_FORMAT() при запросе.
Работа с датой и временем в MySQL+PHP
Ниже представлен пример, в котором используются функции даты. Приведенный запрос выбирает все записи с величиной date_col в течение последних 30 дней:
Примечание: в версии 4.0 функция WEEK(#,0) была изменена с целью соответствия календарю США.
Заметьте, если неделя является последней неделей прошлого года, MySQL вернет 0 если вы не указали 2 или 3 как опциональный аргумент:
Можно считать, что MySQL должен вернуть 52, так как данная дата и является 52-ой неделей года 1999. Мы решили возвращать 0, так как мы хотим, чтобы функция давала «номер недели в указанном году». Это делает функцию WEEK() более надежной при использовании совместно с другими функциями, которые вычисляют части дат.
Если вам все же важно уточнить корректную неделю в году, тогда вы можете использовать 2 или 3 как опциональный аргумент или использовать YEARWEEK()
Обратите внимание, что номер недели отличается от того, который возвращает функция WEEK() (0), будучи вызванной с опциональным аргументом 0 или 1. Это потому, что WEEK() возвращает номер недели именно в указанном году.
HOUR(time)- Возвращает час для аргумента time в диапазоне от 0 до 23:
В MySQL формат выражения expr допускает любые разделительные знаки. Разделители, представленные в данной таблице, приведены в качестве примеров. Если аргумент date является величиной типа DATE и предполагаемые вычисления включают в себя только части YEAR, MONTH, и DAY (т.е. не содержат временной части TIME), то результат представляется величиной типа DATE. В других случаях результат представляет собой величину DATETIME:
При использовании некорректных значений дат результат будет равен NULL. Если при суммировании MONTH, YEAR_MONTH или YEAR номер дня в результирующей дате превышает максимальное количество дней в новом месяце, то номер дня результирующей даты принимается равным последнему дню нового месяца:
Из предыдущего примера видно, что слово INTERVAL и ключевое слово type не являются регистро-зависимыми.
Функция TO_DAYS() не предназначена для использования с величинами, предшествующими введению григорианского календаря (1582), поскольку не учитывает дни, утерянные при изменении календаря.
Функция FROM_DAYS() не предназначена для использования с величинами, предшествующими введению григорианского календаря (1582), поскольку она не учитывает дни, утерянные при изменении календаря.
Все другие символы просто копируются в результирующее выражение без интерпретации:
В MySQL 3.23 символ ‘%’ должен предшествовать символам определителя формата. В более ранних версиях MySQL символ ‘%’ необязателен.
Причина того, что промежутки для месяца и дня начинаются с нуля заключается в том, что MySQL позволяет использовать неполные даты, такие как ‘2004-00-00’, начиная с MySQL 3.23.
При использовании функции UNIX_TIMESTAMP в столбце TIMESTAMP эта функция будет возвращать величину внутренней временной метки непосредственно, без подразумеваемого преобразования строки во временную метку («string-to-unix-timestamp» ). Если заданная дата выходит за пределы допустимого диапазона, то функция UNIX_TIMESTAMP() возвратит 0, но следует учитывать, что выполняется только базовая проверка (год 1970-2037, месяц 01-12, день 01-31). Если необходимо выполнить вычитание столбцов UNIX_TIMESTAMP(), результат можно преобразовать к целым числам со знаком. See Раздел 6.3.5, «Функции приведения типов».