Ben*_*Lee 44
更新:我认为/sf/answers/1493128521/是一个更好的答案.
你可以用一些日期算术来做到这一点:
SELECT some_columns,
DATE_ADD(
DATE_FORMAT(the_date, "%Y-%m-%d %H:00:00"),
INTERVAL IF(MINUTE(the_date) < 30, 0, 1) HOUR
) AS the_rounded_date
FROM your_table
Run Code Online (Sandbox Code Playgroud)
说明:
DATE_FORMAT:DATE_FORMAT(the_date, "%Y-%m-%d %H:00:00")将截断的日期返回到最接近的小时(将分钟和秒钟部分设置为零).
MINUTE:MINUTE(the_date)获取日期的分钟值.
IF:这是有条件的; 如果参数1中的值为true,则返回参数2,否则返回参数3.因此IF(MINUTE(the_date) < 30, 0, 1)表示"如果分钟值小于30,则返回0,否则返回1".这就是我们将要使用的内容 - 它是重新添加的小时数.
DATE_ADD:这会将轮次的小时数添加到结果中.
rjh*_*dby 31
半小时是30分钟.只需添加30分钟的时间戳并截断分钟和秒.
SELECT DATE_FORMAT(DATE_ADD(timestamp_column, INTERVAL 30 MINUTE),'%Y-%m-%d %H:00:00') FROM table
Cod*_*der 12
灵魂的第一个解决方案截断而不是舍入,第二个解决方案不适用于夏令时案例,例如:
select FROM_UNIXTIME(UNIX_TIMESTAMP('2012-03-11 2:14:00') - MOD(UNIX_TIMESTAMP('2012-03-11 2:14:00'),300));
Run Code Online (Sandbox Code Playgroud)
这是另一种方法(1):
DATE_ADD(
tick,
INTERVAL (IF((MINUTE(tick)*60)+SECOND(tick) < 1800, 0, 3600) - (MINUTE(tick)*60)+SECOND(tick)) SECOND
)
Run Code Online (Sandbox Code Playgroud)
如果您不需要担心秒钟,可以像这样简化它(2):
DATE_ADD(
tick,
INTERVAL (IF(MINUTE(tick) < 30, 0, 60) - MINUTE(tick)) MINUTE
)
Run Code Online (Sandbox Code Playgroud)
或者如果你喜欢截断而不是圆形,这里是灵魂方法的简单版本(3):
DATE_SUB(tick, INTERVAL MINUTE(tick)*60+SECOND(tick) SECOND)
Run Code Online (Sandbox Code Playgroud)
编辑:我在本地计算机上查询了一些这些查询,发现对于100,000行,平均时间如下:
UNIXTIME方法:0.0423毫秒(快速,但不适用于夏令时)DATE_FORMAT方法:0.1495毫秒使用datetime数据类型时,这有点令人讨厌; 存储函数的一个很好的候选者.
Run Code Online (Sandbox Code Playgroud)DATE_SUB(DATE_SUB(time, INTERVAL MOD(MINUTE(time),5) MINUTE ), INTERVAL SECOND(time) SECOND)使用UNIXTIME时间戳时更容易,但这仅限于1970 - 2038年的日期范围.
Run Code Online (Sandbox Code Playgroud)FROM_UNIXTIME(UNIX_TIMESTAMP(time) - MOD(UNIX_TIMESTAMP(time),300))祝好运.
| 归档时间: |
|
| 查看次数: |
44370 次 |
| 最近记录: |