我正在尝试查找一个MySQL查询,该查询将从指定的日期时间获取下一个半小时的时间。我明确指的是下一个半小时,而不是下一个半小时点。
例如:
我遇到了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级别实现它,因为查询的其余部分也可以有效地执行其他日期比较功能。
答案 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级别上这将 更容易:-)这就是说,这就是你可以做的:
最终结果是:
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(小时,分钟,秒)功能构建所需的值。