2012-02-17 3 views
33

Я пытаюсь взять дату из своей базы данных в стандартную метку времени и отобразить ее как ISO 8601. Я не могу легко сделать это на PHP, поэтому я пытаюсь сделать это в моей инструкции SELECT. Это то, что у меня есть, но на дисплее появляется ошибка:Дата форматирования в MySQL SELECT как ISO 8601

SELECT * FROM table_name ORDER BY id DESC DATE_FORMAT(date,"%Y-%m-%dT%TZ") 

Что я делаю неправильно?

ответ

49

DATE_FORMAT(DateColumn) должен быть в SELECT списке:

SELECT DATE_FORMAT(date, '%Y-%m-%dT%TZ') AS date_formatted 
FROM table_name 
ORDER BY id DESC 
+3

Это не работает, когда в некоторых таких зон, как испания. Им нужна разница во времени вместо Z после времени +01: 00. В php это отлично работает: date ("c", strtotime ($ comment ['datetime']), – David

+0

Не работает для меня, последнее значение формата - это что-то вроде 530Z вместо +02: 00 – DanFromGermany

+3

@David Это потому, что эта функция предполагает, что DateTime находится в UTC. – sennett

2

Вы должны переместить DATE_FORMAT к избранной части запроса, как это:

SELECT *, DATE_FORMAT(date,"%Y-%m-%dT%TZ") AS date FROM table_name ORDER BY id DESC 
4

Почему это трудно сделать это в PHP?

date("Y-m-d\TH:i:sO",strtotime($sqldata['time'])); 

Во всяком случае, DATE_FORMAT потребности быть в полях, чтобы выбрать, не пристегивается к концу.

+5

'date (" c ", strtotime ($ sqldata ['time']));' [функция даты в php] (http://php.net/manual/en /function.date.php) – chaim

+0

Просто обратите внимание: используя PHP для преобразования дат, вы можете столкнуться с проблемами с памятью сервера, если есть очень большой набор данных. –

2

DATE_FORMAT(date, '%Y-%m-%dT%TZ') должно быть в пункте select.

SELECT DATE_FORMAT(date, '%Y-%m-%dT%TZ') 
FROM table_name 
ORDER BY id DESC 
4

DATE_FORMAT работает только на даты MySQL столбцов, а не временные метки.

Временная метка UNIX представляет собой целое число, содержащее количество секунд с 1 января 1970 г. по UTC. Чтобы отформатировать это как дату ISO 8601, вам нужно использовать функцию FROM_UNIXTIME().

FROM_UNIXTIME принимает те же строки формата как DATE_FORMAT, так форматировать столбец с именем «созданного» вы хотите:

SELECT created /* e.g. 1288799488 */ , 
     FROM_UNIXTIME(created,'%Y-%m-%dT%TZ') /* e.g. 2010-11-03T08:51:28Z */ 
FROM table_name 
2

Это работало для меня

DATE_FORMAT(CONVERT_TZ(`timestamp`, @@session.time_zone, '+00:00') ,'%Y-%m-%dT%TZ')