【问题标题】:Selecting between two timestamps returns no data在两个时间戳之间进行选择不会返回任何数据
【发布时间】:2017-09-06 08:11:48
【问题描述】:

我有两个相隔 65 秒的 unix 时间戳,我正在尝试以这种方式查询 mysql

这是相隔 65 秒 1504684252 + 65

SELECT ask FROM live_rates WHERE the_time BETWEEN UNIX_TIMESTAMP(1504684252) 和 UNIX_TIMESTAMP(1504684317)

SELECT ask FROM live_rates WHERE the_time BETWEEN FROM_UNIXTIME(1504684252) 和 FROM_UNIXTIME(1504684317)

在我的表中,有一个事件从时间戳1504684252 开始,并在 65 秒后结束。为什么两个查询都没有返回数据?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您的问题并没有明确说明 the_time 是什么数据类型 - 如果它已经是 unix 时间戳(即整数),只需将其作为整数查询,因为您似乎知道您的 unix 时间戳日期范围:

    SELECT ask FROM live_rates WHERE  the_time BETWEEN 1504684252 AND 1504684317
    

    如果您在the_time 中的数据存储为日期时间,我会说您应该确保服务器确实将您提供的值转换为包含相关记录的日期时间范围:

    SELECT ask FROM live_rates WHERE id = abcdef
    
    SELECT FROM_UNIXTIME(1504684252), FROM_UNIXTIME(1504684317)
    

    运行这两个查询(替换了 id)并观察数据。我敢肯定,您会找到原因 - 可能类似于时区问题,并且您的 unix 时间戳正在转换为 UTC 中的某个时间,而您的表数据显示的是其他时间,因此您错误地翻译了显示的时间进入一个 unix 时间。或者它可能是一个结束日期,它的某些时间分量超出了您指定的 unix 时间范围,即使它的日期部分是正确的。

    如果没有一个完整的、可验证的示例(一个带有插入的测试数据的创建表语句和一个演示问题的选择。试试 sqlfiddle.com),很难确定。

    ps;不要以您在此处编写的方式使用 UNIX_TIMESTAMP();它不打算将 unix 时间戳传递给它。您要么不传递任何参数(在这种情况下,它会为您提供服务器时钟的当前日期时间,作为 unix 时间戳),或者您传递一些日期时间(它会返回与该日期时间等效的 unix 时间戳)

    【讨论】:

      【解决方案2】:

      如果 the_time 是 unix 时间戳而不是日期,即 1504684252 而不是 2017-09-01 00:00:00,那么您不需要 FROM_UNIXTIME,它将 unix 时间戳转换为日期:

      SELECT ask FROM live_rates WHERE the_time BETWEEN 1504684252 AND 1504684317
      

      【讨论】:

        【解决方案3】:

        UNIX_TIMESTAMP 将日期/时间作为参数并返回一个整数。当你用一个整数喂它时,它返回 0 - 所以你在 0 和 0 之间选择。

        FROM_UNIXTIME 接受一个整数,但它返回一个日期/时间 - 所以如果 the_time 是一个整数,它们是不兼容的。

        【讨论】:

          猜你喜欢
          • 2018-04-17
          • 2012-02-02
          • 2017-06-15
          • 2013-10-18
          • 2018-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多