在指定时间后获取下一个xx:30时间(下一个半小时)

时间:2009-10-28 19:37:31

标签: mysql datetime date

我正在尝试查找一个MySQL查询,该查询将从指定的日期时间获取下一个半小时的时间。我明确指的是下一个半小时,而不是下一个半小时点。

例如:

  • 如果日期时间是“2009-10-27 08:15:24“,答案是肯定的 “2009-10-27 08:30:00”
  • 如果 datetime是“2009-10-27 08:49:02”, 答案是“2009-10-27 九时30" 分00秒。

我遇到了this page,它引用了SQL Server,并且在该线程结束时出现了类似的问题。但它并不完全相同,它依赖于MySQL没有的功能。

以下是更完整的示例列表和预期返回值:

2009-10-27 08:15:24  should return  2009-10-27 08:30:00
2009-10-27 08:49:02  should return  2009-10-27 09:30:00
2009-10-27 23:49:10  should return  2009-10-28 00:30:00
2009-10-27 10:30:00(.000001)  should return  2009-10-27 11:30:00

(请注意,在第四个例子中,因为确切的一半(10:30:00.0000000)已经消失,所以找到了下一个半小时点。)

我尝试过使用这种东西:

SELECT IF( (MINUTE(NOW()) < 30), HOUR(NOW()), (HOUR(NOW()) + 1) )

(之后会添加一个CONCATed字符串),但由于转换到另一天它会失败,并且它本身就是'hacky'。

有人能推荐一种合适的算法吗?我不希望得到完整的答案(尽管那会很好!),但是关于算法种类的建议会有所帮助。我已经抽了两个小时的纸张了!我有一种预感,使用模数可能会有用,但我对使用它并不十分熟悉。

稍后会将答案提供给PHP类,但如果可能的话,我宁愿在SQL级别实现它,因为查询的其余部分也可以有效地执行其他日期比较功能。

3 个答案:

答案 0 :(得分:2)

这有点乱,但有效:

select from_unixtime( floor((unix_timestamp(MY_DATE)+(30*60))/(60*60))*(60*60) + (30*60) )

它将时间推进30分钟,然后截断到小时的顶部,然后增加30分钟。因为它工作的是unix时间戳(自1970年以来的秒数),所以你不必担心天,月,年等的界限。

答案 1 :(得分:0)

我不禁注意到,在PHP级别上这将 更容易:-)这就是说,这就是你可以做的:

  1. 使用DATE_ADD()为您的日期时间添加30分钟;如果它已经过了半小时,这将移至下一个小时
  2. 通过提取日期/小时和硬编码分钟/秒来创建新的日期时间值。 CONVERT()ADDTIME()MAKETIME()都有帮助。
  3. 最终结果是:

    select ADDTIME(
     CONVERT(DATE(DATE_ADD(yourDateTime, INTERVAL 30 MINUTE)), DATETIME), # date part
     MAKETIME(HOUR(DATE_ADD(yourDateTime, INTERVAL 30 MINUTE)), 30, 0) # hour + :30:00
    ) from ...
    

答案 2 :(得分:0)

使用MAKETIME(小时,分钟,秒)功能构建所需的值。