Mysql5.7 虚拟列数据类型为DATE时,如何存入数据?

表结构:v_date为虚拟列

CREATE TABLE `test` (
    `json` TEXT NULL,
    `date` DATETIME NULL DEFAULT NULL,
    `v_date` DATE AS (json_extract(`json`,'$.date')) VIRTUAL
)
COMMENT='测试表\r\n'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;

插入:

INSERT INTO test (json) VALUES ('{"date":"2019-01-21 00:00:00"}');

报错:

ERROR 3156 (22018): Invalid JSON value for CAST to DATE/TIME/DATETIME/TIMESTAMP from column json_extract at row 1

尝试了各种格式:

INSERT INTO `test`.`test_virtual_column` (`json`) VALUES ('{"date":"20191221"}');
/* SQL错误(3156):Invalid JSON value for CAST to DATE/TIME/DATETIME/TIMESTAMP from column json_extract at row 1 */

INSERT INTO `test`.`test_virtual_column` (`json`) VALUES ('{"date":20191221}');
/* SQL错误(3156):Invalid JSON value for CAST to DATE/TIME/DATETIME/TIMESTAMP from column 
json_extract at row 1 */

请问如何保存Date类型的数据到虚拟列中?

阅读 2.8k
2 个回答
✓ 已被采纳新手上路,请多包涵

要先使用json_unquote()函数来去除JSON值的引号,建议新建虚拟列时都使用此函数。

CREATE TABLE `test_virtual_column` (
    `json` JSON NULL DEFAULT NULL,
    `date` DATETIME NULL DEFAULT NULL,
    `v_date` DATETIME AS (json_unquote(json_extract(`json`,'$.date'))) VIRTUAL
)

感觉这个问题有点南辕北辙
应该考虑从程序角度转换时间,对外统一输出接口
不然你以后页面显示换了,对接端换了 还要强行转化为JSON结构

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题