如何使用MySQL查询JSON对象中未修改的时间戳?

问题描述 投票:1回答:1

我想查询一个包含名为'time'的MySQL TIMESTAMP的JSON对象:

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
  }
}

是否可以在JSON对象中访问保持其原始类型和表示(如"2019-04-04T12:00:00.000Z")的时间?对此有何建议和干净的方法?

mysql json timestamp iso8601
1个回答
1
投票

您可以使用DATE_FORMAT()在表达式中生成ISO 8601格式的日期。

Format date in MySQL SELECT as 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以'YYYY-MM-DD HH:MM:SS'格式检索并显示DATETIME值。

非hacky方式是使用该格式。如果要使用其他格式(甚至是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'))
© www.soinside.com 2019 - 2024. All rights reserved.