我使用MySQL json数据类型来存储JSON字符串。
在JSON字符串中有两个字段:entry_time
和entry_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','')
但我无法得到任何帮助,我们将非常感谢!
答案 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
)