我使用的是MySQL5.7.28版本。我有如下json数据。
CREATE TABLE `week2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` smallint(1),
`json` text ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO week2(id,type,json)
VALUES
(121,1,'[{"weekdays":"Sunday"},{"weekdays":"Monday"},{"weekdays":"Tuesday"},{"weekdays":"Wednesday"},{"weekdays":"Thursday"},{"weekdays":"Friday"},{"weekdays":"Saturday"}]'),
(122,1,'[{"weekdays":"Sunday"},{"weekdays":"Monday"}]'),
(123,2,'[{"start_time":"08:00 AM","end_time":"10:00 PM"}]');
如您所见,json列包含嵌套的json数据。所以在这里我想比较一下今天(星期六,我们现在处于开始时间和结束时间之间)
预期结果:
(121,1,'[{"weekdays":"Sunday"},{"weekdays":"Monday"},{"weekdays":"Tuesday"},{"weekdays":"Wednesday"},{"weekdays":"Thursday"},{"weekdays":"Friday"},{"weekdays":"Saturday"}]'),
(123,2,'[{"start_time":"08:00 AM","end_time":"10:00 PM"}]');
2条答案
按热度按时间b91juud31#
您需要检测日期名称(1)和时间段(2),并在末尾使用or运算符将这两个条件组合起来。
for(1):使用
DAYNAME()
函数,并使用JSON_CONTAINS
功能。对于(2):
TIME()
功能和CAST
将字符串绑定到TIME
数据类型可能与一个技巧一起使用,为PM
键入时间。因此,考虑使用:
演示
u91tlkcl2#
也许是这样的:
第一个查询使用json_extract提取时间,使用json_unquote删除(
"
)然后将其作为子查询。在外部查询中,找到
weekdays
使用json搜索的值与今天的值进行比较DAYNAME(CURDATE())
; 如果JSON_SEARCH
如果没有找到它,它会回来的NULL
因此IS NOT NULL
使用条件。追加
OR
比较CURRENT_TIME
将时间值从json
现场。但首先,使用CASE
表达式来确定它是否AM
或者PM
; 如果是的话AM
,只是REPLACE
这个AM
用秒针(:00
). 如果是的话PM
,执行REPLACE
就像AM
然后使用将时间值转换为秒TIME_TO_SEC
然后加上43200秒(12小时),再次转换为标准hour:minute:second
格式使用SEC_TO_TIME
.p/s:这是我试图回答的问题,但我没有发帖,因为我在时间上得到了错误的结果。。只有当我把
CURRENT_TIME
在小提琴中我意识到小提琴的时区和我的不同。另外,我还在本地数据库上进行测试;这是mariadb和使用STR_TO_TIME
是不同的。老实说,在我看来,如果这是mariadb,我认为有可能查询要短得多。