【问题标题】:mysql - how to get a random time (not date) between two time rangesmysql - 如何在两个时间范围之间获取随机时间(不是日期)
【发布时间】:2014-11-06 12:45:25
【问题描述】:

我正在尝试找出如何在 2 个时间范围之间返回随机时间。 例如,获取 15:00:00 到 22:00:00 之间的随机时间

到目前为止,我有 - 但不知道如何限制它

select sec_to_time(floor(15 + (rand() * 86401)))

任何帮助将不胜感激!

【问题讨论】:

    标签: mysql random time


    【解决方案1】:
    SELECT SEC_TO_TIME(
              FLOOR(
                 TIME_TO_SEC('15:00:00') + RAND() * (
                      TIME_TO_SEC(TIMEDIFF('22:00:00', '15:00:00'))
                 )
              )
            );
    

    以秒计算。然后添加一个在15:00:0022:00:0015:00:00 之间的秒范围内的随机数。然后将秒转换回时间值。

    • 有关所用函数的更多信息,请参阅this link

    【讨论】:

    • 我知道您发布此答案已有 2.5 年了,但您设法解决了一个我自己无法解决的问题。谢谢@fancyPants!
    【解决方案2】:

    逻辑很简单,

    1. 获取 2 次之间的差异。
    2. 在这 2 次(数字)之间生成随机数
    3. 您可以直接以分钟或秒为单位生成时间。

    以下是获取随机时间的示例,

    select Round((FLOOR(RAND() * (TIME_TO_SEC('15:00:00') - TIME_TO_SEC('22:00:00') + 1)) + TIME_TO_SEC('22:00:00')) / 3600,0)
    

    编辑:Fiddle

    参考见this link

    【讨论】:

      【解决方案3】:

      试试这个方法

      select FROM_UNIXTIME(UNIX_TIMESTAMP('<starting_date_in_date_format>') + FLOOR(0 + (RAND() * UNIX_TIMESTAMP('<ending_date_in_date_format>'))) from dual;
      

      【讨论】:

      • 不应该是select FROM_UNIXTIME(UNIX_TIMESTAMP('&lt;starting_date_in_date_format&gt;') + FLOOR(RAND() * (UNIX_TIMESTAMP('&lt;ending_date_in_date_format&gt;') - UNIX_TIMESTAMP('&lt;starting_date_in_date_format&gt;'))),因为 rand 应该乘以 unix 结束和开始时间戳之间的距离,而不是 unix 结束时间戳本身。 Unix 时间戳只是一个整数,所以我们基本上是从范围内生成随机数:range_start + floor(rand() * (range_end - range_start))
      猜你喜欢
      • 2014-05-22
      • 2012-08-08
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多