Mysql 获取两个时间间隔重叠的日期之间的记录
我有以下数据库Mysql 获取两个时间间隔重叠的日期之间的记录,mysql,sql,date,datetime,Mysql,Sql,Date,Datetime,我有以下数据库 CREATE TABLE `table` ( `id` int(10) NOT NULL AUTO_INCREMENT, `time` bigint(20) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `messages` varchar(2000) NOT NULL, PRIMARY KEY (`id`) ) INSERT INTO `table` VALUES (1,1467311473,"Jim", "Jim wants a
CREATE TABLE `table` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`time` bigint(20) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`messages` varchar(2000) NOT NULL,
PRIMARY KEY (`id`)
)
INSERT INTO `table` VALUES (1,1467311473,"Jim", "Jim wants a book"),
(2,1467226792,"Tyler", "Tyler wants a book"),
(3,1467336672,"Phil", "Phil wants a book");
我需要获取2016年6月29日至2016年7月1日期间18:59:52至01:31:12的记录。
我编写了一个查询,但它没有返回所需的输出
SELECT l.*
FROM table l
WHERE ((time >=1467226792) AND (CAST(FROM_UNIXTIME(time/1000) as time) >= '18:59:52') AND (CAST(FROM_UNIXTIME(time/1000) as time) <= '01:31:12') AND (time <=1467336672))
选择l*
来自表l
其中((time>=1467226792)和(CAST(FROM UNIXTIME(time/1000)as time)>='18:59:52')和(CAST(FROM UNIXTIME(time/1000)as time),如果我没弄错的话
SELECT l.*
FROM `table` l
WHERE time >=1467226792
AND time <=1467336672
AND CAST(FROM_UNIXTIME(time/1000) as time) >= '18:59:52'
AND FROM_UNIXTIME(time/1000) <= DATE_ADD(DATE_ADD(DATE_ADD(CAST(FROM_UNIXTIME(time/1000) as date), INTERVAL 25 HOUR), INTERVAL 31 MINUTE), INTERVAL 12 SECOND)
选择l*
从'table'l开始
其中时间>=1467226792
时间='18:59:52'
如果我没弄错的话,我会从\u UNIXTIME(time/1000)开始
SELECT l.*
FROM `table` l
WHERE time >=1467226792
AND time <=1467336672
AND CAST(FROM_UNIXTIME(time/1000) as time) >= '18:59:52'
AND FROM_UNIXTIME(time/1000) <= DATE_ADD(DATE_ADD(DATE_ADD(CAST(FROM_UNIXTIME(time/1000) as date), INTERVAL 25 HOUR), INTERVAL 31 MINUTE), INTERVAL 12 SECOND)
选择l*
从'table'l开始
其中时间>=1467226792
时间='18:59:52'
据我所知,从_UNIXTIME(time/1000)来看,您只对大于'2016-06-29 18:59:52'和小于'2016-07-01 01:31:12'的所有时段感兴趣,其中时间元素不在'01:31:12'和'18:59:52'之间
我认为您可以将该逻辑转换为sql,而无需进一步的帮助
啊,好吧,这里有一个小把戏-省略了所有的from_unixtime()内容,因为这会给理解问题增加不必要的复杂性-但是根据您的需要调整此解决方案实际上只是在列time
的每个实例前面加上该函数:
据我所知,您只对大于“2016-06-29 18:59:52”且小于“2016-07-01 01:31:12”的所有时段感兴趣,其中时间元素不在“01:31:12”和“18:59:52”之间
我认为您可以将该逻辑转换为sql,而无需进一步的帮助
啊,好吧,这里有一个小把戏-省略了所有的from_unixtime()内容,因为这会给理解问题增加不必要的复杂性-但是根据您的需要调整此解决方案实际上只是在列time
的每个实例前面加上该函数:
将时间戳转换为日期时间。我真的很困惑。什么是'emd\u date'
和'start\u date'
?为什么有字符串常量?表中有哪些列?示例数据和所需结果会有所帮助。@GordonLinoff如果start\u date=21:30:00和end\u date是03:30:00存储日期,则查询无效imes作为一个单一的entity@Strawberry日期和时间存储为单个实体,但要获取给定时间间隔之间的记录,需要将时间戳转换为日期时间。我真的很困惑。什么是'emd_date'
和'start_date'
?为什么有字符串常量?表中有哪些列?Sa示例数据和所需结果会有所帮助。@GordonLinoff如果start\u date=21:30:00,end\u date为03:30:00,则查询不起作用。将日期和时间存储为单个entity@Strawberry日期和时间存储为单个实体,但要在给定的时间间隔内获取记录,需要将其分隔为casting/“time/1000”材料肯定是不必要的。此外,这个解决方案(如果正确)使问题过于复杂。铸造/时间/1000材料肯定是不必要的。此外,这个解决方案(如果正确)使问题过于复杂这将给出“2016-06-29 18:59:52”和“2016-07-01 01:31:12”之间的所有结果,即2016-06-30时间大于01:31:12和小于18:59:52的结果,这是不需要的。所有日期的时间间隔为18:59:52到01:31:12,并且排除所有其他不在两者之间的时间间隔在这些时间段内,这将给出“2016-06-29 18:59:52”和“2016-07-01 01:31:12”之间的所有结果,即2016-06-30中大于01:31:12和小于18:59:52的时间段的结果,这是不需要的。所有日期的时间间隔为18:59:52到01:31:12,不包括这些时间段之间的所有其他时间段