从JSON数据类型

时间:2017-02-17 18:35:50

标签: mysql json extract

我使用MySQL json数据类型来存储JSON字符串。 在JSON字符串中有两个字段:entry_timeentry_date。这些字段的值以ISO 8609格式存储,如下所示:

entry_date:2017-02-15T00:00:00.00Z
entry_time:0000-00-00T04:35:51.29Z

我正在尝试从这两个属性创建一个虚拟列。由于MySQL 5.7具有NO_ZERO_DATE集,我无法看到将这些值作为日期和时间列提取出来的方法。这是我尝试过的:

alter table odh
add entry_time time GENERATED ALWAYS AS (REPLACE,(json_extract(jdoc,'$.entry_time')),'0000-00-00T','')

但我无法得到任何帮助,我们将非常感谢!

2 个答案:

答案 0 :(得分:0)

NO_ZERO_DATE问题之后出现另一个问题:MySQL没有使用ISO 8601作为日期,它使用ISO 9075或SQL日期(实际上它使用全部各种格式,MySQL日期处理非常混乱)。有一些微妙的差异,最大的是9075没有T在中间。大多数日期API通过使T可选而不是MySQL来处理这个问题。

mysql> select time('1234-01-01T04:35:51.29Z');
+---------------------------------+
| time('1234-01-01T04:35:51.29Z') |
+---------------------------------+
| 00:12:34                        |
+---------------------------------+
1 row in set, 1 warning (0.00 sec)

而不是给出错误或忽略T,MySQL给出了一些绝对错误的答案。

mysql> select time('1234-01-01 04:35:51.29Z');
+---------------------------------+
| time('1234-01-01 04:35:51.29Z') |
+---------------------------------+
| 04:35:51.29                     |
+---------------------------------+
1 row in set, 1 warning (0.00 sec)

现在没事。

最简单的方法是用空格替换T.然后TIME()就可以了。

mysql> select time(replace('0000-00-00T04:35:51.29Z', 'T', ' '));
+------------------------------------------------+
| time(substring('0000-00-00T04:35:51.29Z', 12)) |
+------------------------------------------------+
| 04:35:51.29                                    |
+------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

日期部分将由DATE()处理,因为MySQL将忽略其余部分。

mysql> select date('2017-02-15T00:00:00.00Z');
+---------------------------------+
| date('2017-02-15T00:00:00.00Z') |
+---------------------------------+
| 2017-02-15                      |
+---------------------------------+
1 row in set, 1 warning (0.01 sec)

我强烈建议您将它们合并到一个datetime列中,而不是存储单独的日期和时间列。特别是如果他们应该代表一个单一的事件(即2017-20-15的4:35:51.29)。这样可以更轻松地进行比较,并且您始终可以使用DATE()TIME()提取日期和时间部分。

答案 1 :(得分:-1)

不确定,但您可能会发现其中一些有用。假设您从数据库中引入的json字符串开始:

$jsonstring = '{
    "entries": [{
        "entry_date": "2017-02-15T00:00:00.00Z",
        "entry_time": "0000-00-00T04:35:51.29Z"
    }, {
        "entry_date": "2017-02-16T00:00:00.00Z",
        "entry_time": "0000-00-00T05:21:08.12Z"
    }, {
        "entry_date": "2017-02-17T00:00:00.00Z",
        "entry_time": "0000-00-00T07:14:55.04Z"
    }]
}';

以下代码会将其转换为单个字段:

$json = json_decode($jsonstring, true);

//display the json string before conversion
echo "<pre>";
print_r($json['entries']);
echo "</pre>";


$myArray = [];
for($i = 0; $i < count($json['entries']); $i++) {
    $myArray[] = substr($json['entries'][$i]['entry_date'], 0, 10). 
        substr($json['entries'][$i]['entry_time'], 10);
}
//display the json string after conversion
echo "<pre>";
print_r($myArray);
echo "</pre>";

结果如下:

Array
(
    [0] => 2017-02-15T04:35:51.29Z
    [1] => 2017-02-16T05:21:08.12Z
    [2] => 2017-02-17T07:14:55.04Z
)