Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 午夜前和午夜后的时间间隔_Mysql_Sql - Fatal编程技术网

Mysql 午夜前和午夜后的时间间隔

Mysql 午夜前和午夜后的时间间隔,mysql,sql,Mysql,Sql,我想让这张桌子在24小时内把这两次之间的时间还给我。但它什么也不返回 SELECT `measurementtime`, `measurementvalue` FROM (SELECT `measurementtime`, `measurementvalue` FROM `usermeasurements` WHERE userid = 1 ORDER BY measurement

我想让这张桌子在24小时内把这两次之间的时间还给我。但它什么也不返回

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)