Mysql 午夜前和午夜后的时间间隔
我想让这张桌子在24小时内把这两次之间的时间还给我。但它什么也不返回Mysql 午夜前和午夜后的时间间隔,mysql,sql,Mysql,Sql,我想让这张桌子在24小时内把这两次之间的时间还给我。但它什么也不返回 SELECT `measurementtime`, `measurementvalue` FROM (SELECT `measurementtime`, `measurementvalue` FROM `usermeasurements` WHERE userid = 1 ORDER BY measurement
SELECT `measurementtime`,
`measurementvalue`
FROM (SELECT `measurementtime`,
`measurementvalue`
FROM `usermeasurements`
WHERE userid = 1
ORDER BY measurementtime DESC
LIMIT 30) AS temp1
WHERE Hour(measurementtime) >= '16:00:00'
AND Hour(measurementtime) <= '04:59:59'
ORDER BY Hour(measurementtime)
所以问题似乎是我要求在两个不同的日子之间找出时间。那怎么办?我需要保持这样的时间段,而且我不想处理日期
参赛作品是这样的
MeasurementTime MeasurementValue UserMeasurementID
2017-07-11 17:00:00 123 114
2017-07-11 17:00:00 123 115
2017-07-10 20:00:00 12 116
2017-03-15 16:31:00 3 113
2017-03-03 01:03:00 12 112
2016-12-28 15:05:15 39 109
2016-12-19 15:10:29 6 107
这些并不是所有的条目对于穿越午夜的特殊情况,请尝试以下方法:
SELECT `measurementtime`,
`measurementvalue`
FROM (SELECT `measurementtime`,
`measurementvalue`
FROM `usermeasurements`
WHERE userid = 1
ORDER BY measurementtime DESC
LIMIT 30) AS temp1
WHERE HOUR(measurementtime) >= 16
OR HOUR(measurementtime) BETWEEN 0 AND 4
ORDER BY HOUR(measurementtime)
如果可以在带有变量的存储过程中执行此操作,则更通用的版本可能是:
SET @range_start = 16;
SET @range_end = 4;
SELECT
`measurementtime`,
`measurementvalue`
FROM (SELECT `measurementtime`,
`measurementvalue`
FROM `usermeasurements`
WHERE userid = 1
ORDER BY measurementtime DESC
LIMIT 30) AS temp1
WHERE
IF(@range_start > @range_end,
HOUR(measurementtime) >= 16
OR HOUR(measurementtime) < 4,
measurementtime BETWEEN @range_start AND @range_end
ORDER BY HOUR(measurementtime)
@Sloan的答案很好,但这里有另一个使用union的选项
SELECT `measurementtime`,
`measurementvalue`
FROM (SELECT `measurementtime`,
`measurementvalue`
FROM `usermeasurements`
ORDER BY measurementtime DESC
LIMIT 30) AS temp1
WHERE Hour(measurementtime) between '16:00:00'
AND '23:59:59'
union
SELECT `measurementtime`,
`measurementvalue`
FROM (SELECT `measurementtime`,
`measurementvalue`
FROM `usermeasurements`
ORDER BY measurementtime DESC
LIMIT 30) AS temp1
WHERE Hour(measurementtime) between '0:0:0'
AND '04:59:59'
ORDER BY Hour(measurementtime)
下面是一个例子,用你在问题中发布的数据来尝试一下。当然,我必须从WARE部分删除用户ID才能使其正常工作。HOUR将小时提取为数字,如4或16,而不是字符串。如果没有日期部分,则必须在午夜和这两个值之间进行检查。此外,任何值都不会大于16且小于4。小时从datetime格式中提取小时并保留日期。这就是问题所在。而且,你不能正确地将16:00:00与一个数字进行比较。@Sloarchasher没有整数值,但在谈论时间时可以,但我也不确定你的意思是什么?您是说要在16:00:00和23:59:59之间执行时间,还是在00:00:00和04:59:59之间执行时间?1至于存储过程,我喜欢它。如果您需要将时间与包括分和秒而不仅仅是小时的范围进行比较,您可以使用time函数获取datetime的时间部分。在这种情况下,与16:00:00和04:59:59进行比较是有意义的。因此,我应该使用timemeasurementtime而不是hourmeasurementtime?正如前面提到的,这取决于您的范围是以小时为单位指定的,还是以小时、分钟和秒为单位。。
SELECT `measurementtime`,
`measurementvalue`
FROM (SELECT `measurementtime`,
`measurementvalue`
FROM `usermeasurements`
ORDER BY measurementtime DESC
LIMIT 30) AS temp1
WHERE Hour(measurementtime) between '16:00:00'
AND '23:59:59'
union
SELECT `measurementtime`,
`measurementvalue`
FROM (SELECT `measurementtime`,
`measurementvalue`
FROM `usermeasurements`
ORDER BY measurementtime DESC
LIMIT 30) AS temp1
WHERE Hour(measurementtime) between '0:0:0'
AND '04:59:59'
ORDER BY Hour(measurementtime)