Как запросить неизмененную метку времени внутри объекта JSON, используя MySQL? - PullRequest
1 голос
/ 15 апреля 2019

Я хотел бы запросить объект JSON, содержащий MySQL TIMESTAMP с именем 'time':

SELECT time, JSON_OBJECT('t', time, 'v', value) AS value FROM values

Но, к сожалению, MySQL автоматически преобразует метку времени в формате ISO 8601 "2019-04-04T12:00:00.000Z" в эту презентацию "2019-04-04 12:00:00.000000".См. Следующий ответ:

{
  "time": "2019-04-04T12:00:00.000Z",
  "value": {
    "t": "2019-04-04 12:00:00.000000",
    "v": 30
  }
}

Можно ли получить доступ к времени, сохраняя свой исходный тип и представление (как "2019-04-04T12:00:00.000Z") внутри объекта JSON?Какой рекомендуемый и чистый подход к этому?

1 Ответ

1 голос
/ 16 апреля 2019

Вы можете использовать DATE_FORMAT () , чтобы сделать дату формата ISO 8601 в выражении.

См. Формат даты в MySQL SELECT как ISO 8601

В вашем случае:

SELECT DATE_FORMAT(time, '%Y-%m-%dT%TZ'), 
  JSON_OBJECT('t', DATE_FORMAT(time, '%Y-%m-%dT%TZ'), 'v', value) AS value 
FROM values

Или альтернативно:

SELECT v.time_8601, JSON_OBJECT('t', v.time_8601, 'v', v.value) AS value
FROM (SELECT DATE_FORMAT(time, '%Y-%m-%dT%TZ') AS time_8601, value FROM values) AS v

Ваш комментарий:

https://dev.mysql.com/doc/refman/8.0/en/datetime.html говорит:

MySQL извлекает и отображает значения DATETIME в формате «ГГГГ-ММ-ДД ЧЧ: ММ: СС».

Не хакерский способ - использовать этот формат. Если вы хотите использовать другой формат (даже формат ISO), вы должны использовать функции DATE_FORMAT () и STR_TO_DATE ().

Есть функция GET_FORMAT () , которая возвращает строку формата для некоторых популярных вариантов. Но он не поддерживает формат ISO 8601 (это специально указано в руководстве, как если бы этот вопрос уже задавался).

-- formats in ISO 9075 like '%Y-%m-%d %H:%i:%s', NOT ISO 8601
DATE_FORMAT(time, GET_FORMAT(DATETIME, 'ISO'))
...