我想查询一个包含名为“ 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
}
}
是否可以访问时间以将其原始类型和表示形式(如"2019-04-04T12:00:00.000Z"
保留在JSON对象中)?推荐的清洁方法是什么?
答案 0 :(得分: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'))